TL; DR: ืื ื ืืืชื ืืืืื ืืืื ืฉืืงืจื ืคืงืืืืช ืืืืขื ICMP ืืืืฆืข ืืืชื ืืฉืจืช ืื ืื ื-SSH ืฉืื ืงืืจืก. ืขืืืจ ืืกืจื ืืกืืื ืืช, ืื ืืงืื ืืื
ืึฐืึดืืจืึผืช! ืืชืื ืชื C ืื ืืกืื ืืกืชืื ืื ืืคืจืืฅ ืืืืขืืช ืฉื ืื! ืืืื ืืืืืช ืฉืื ื ืืคืืื ืืืขื ืืืจืืื ืืืืืื, ืืื ืื ืืืงืืจืช ืชืชืงืื ืืืจืื. ืืคืืกื ืืืืขื ืืื ืฉืืฉ ืื ืืืฉื ืืก ืืืื ืขื ืชืื ืืช C ืืจืืฆืื ืืืกืชืื ืขื ืืฆื ืืคื ืืื ืฉื ืืื ืืงืก.
ืืชืืืืืช ืืจืืฉืื ืฉืื
ืื, ืืฉื ืช 2020 ืืืืชื ืฉืืชื ืืืื ืืืื ืืก ืืืขื ืฉืจืืจืืชื ืืชืื ืื ืืช ICMP. ืืื ืืืื ืืืืืจ ืืืฉืจ ืืฃ ืคืขื! ืืืืืืื ืฉืืคืฉืจ ืืขืฉืืช ืืฉืื ืื ืืืื, ืื ืฆืจืื ืืขืฉืืช ืืช ืื. ืืืืืื ืฉืืืื ืืืืืืื ืื ื ืืฉืชืืฉ ืืจืื ืืฉืืจืช ืืคืงืืื, ืืืื ืืจื SSH, ืืจืขืืื ืฉื ืืขืืคืช ICMP ืขืื ืืจืืฉื ืืจืืฉ. ืืืื ืืืจืืื ืืื ืื ืืื ืืื ืฉืื, ืืืืืชื ืืืชืื ืืืชื ืืืืืื ืืื ืืงืก ืืฉืคื ืฉืืฉ ืื ืจืง ืืืฉื ืืก ืขืืื. ืืขืืคืช ืืื ืื ืชืืื ืืืืื ืืจืฉืืืช ืืชืืืืืื, ืืชื ืืืื ืืืขืื ืืืชื ืืชืื ืืงืจื ื ืืืื ืื ืชืืื ืืืขืจืืช ืืงืืฆืื, ืื ืชืจืื ืฉืื ืืืจ ืืฉืื ืืจืฉืืืช ืืฆืืืืช ืืืืื ื. ืืืืื ืช ืืืืืืืช ืฉืื, ืืืืืจ ื-rootkit ืื ืืื ืืื, ืืื ืื ื ืืงืืื ืืฉืคืจ ืืืชื ืืืืฉืชืืฉ ืื ืืืขืืคืช ืฉื ืืืฆื ืืืจืื ืืืฉืจ ืืืืฆืข ืืืขืื ื ืืืื ืืื ืืฉืืื ืืืืื ืก ืืจื SSH ืืืืคืขืื ืืคืืืช echo i > /proc/sysrq-trigger
ืืื ืืฉืืืจ ืืืฉื ืืื ืืชืืื ืืืืฉ.
ืื ืื ื ืืืงืืื ืขืืจื ืืงืกื, ืืืฉืืจื ืชืื ืืช ืืกืืกืืื ื- Python ื-C, ืืืื ื
ืฆื ืืืงืื
ื ืจืื ืื ืฉืืืืง ืืืงืื ืืฆืืจื ืืืชืื ืชืกืจืื ืขื ืืขืจื 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 ืืขืฆืื. ืืืืืื ืืฉ ืืืืื ืืฉื 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
ืืืืขื ืืืืืืช ืืชืืืืืช ืืื ื ืืฉืชื ื.
ืืืืื ืืืื
ืืื ืืื ืืช ืืืื ื ืืืจืืืืืืช ืฉื ืืืืื ืชืฆืืจื ืืคืืืช 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);
ืื ืงืืจื ืคื:
- ืฉื ื ืงืืฆื ืืืชืจืืช ื ืืฉืืื ืืื ืืชืคืขื ืืช ืืืืืื ืขืฆืื ืืืช ื-netfilter.
- ืื ืืคืขืืืืช ืขืืืจืืช ืืจื netfilter, ืืคืฉืจ ืืืืืืจ ืื ืืืื. ืืื ืืขืฉืืช ืืืช, ืืชื ืฆืจืื ืืืืจืื ืขื ืืืื ื ืฉืื ืืื ืืืืืจ. ืืืืจ ืืืฉืื ืืืืชืจ ืืื ืืฆืืื ืืช ืืคืื ืงืฆืื ืฉืชืชืืฆืข ื-hook:
nfho.hook = icmp_cmd_executor;
ืื ื ืืืืข ืืคืื ืงืฆืื ืขืฆืื ืืืืืจ ืืืชืจ.
ืืื ืงืืขืชื ืืช ืืื ืืขืืืื ืฉื ืืืืืื:NF_INET_PRE_ROUTING
ืืฆืืื ืืขืื ืืช ืืืืืื ืืืฉืจ ืืื ืืืคืืขื ืืจืืฉืื ื ืืงืจื ื. ืืืื ืืฉืืฉNF_INET_POST_ROUTING
ืืขืื ืืช ืืืืืื ืืฉืืื ืืืฆืืช ืืืงืจื ื.
ืืืืจืชื ืืช ืืืกื ื ื-IPv4:nfho.pf = PF_INET;
.
ืื ื ื ืืชื ืืืืง ืฉืื ืืช ืืขืืืคืืช ืืืืืื ืืืืชืจ:nfho.priority = NF_IP_PRI_FIRST;
ืืื ื ืจืืฉื ืืช ืืื ื ืื ืชืื ืื ืืชืืจ ื-hook ืืคืืขื: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);
). ืื ื ืื ืืืืจ ืขื ืืื ืื ื ืืืฅ ืืคืกืงื ืืชืฉืืขืืช. - ืขืืฉืื ืื ื ืืืจืื ืขื ืคืื ืงืฆืื, ืฉืชืืื ืืืง. ืืกืื ืืืืืขืื ืื ืืืงืืืืื ืืืืชืืื ืขื ืืื ื-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