TL; DR: áá»áœááºá¯ááºááẠICMP payload á០command áá»á¬ážááá¯áááºááŒá®áž áááºá SSH áá»ááºááœá¬ážáá»áŸááºááẠáá¬áá¬áá±á«áºááœáẠáá¯ááºáá±á¬ááºááá·áº kernel module áá
áºáá¯ááᯠáá±ážáá¬ážáá±áá«áááºá á
áááºáááŸááºáá¯á¶ážá¡ááœááºá áá¯ááºá¡á¬ážáá¯á¶ážáááº
áááááŒá¯áááº! á¡ááœá±á·á¡ááŒá¯á¶ááŸá C áááá¯ááááºáá¬áá»á¬ážááẠááœá±ážáá»ááºáááºáá»á¬ážáá»ááẠá¡áá¹ááá¬ááºááŸááááºá á áá¬ážá¡áá¯á¶ážá¡ááŸá¯ááºážááœá±ááŸá¬áá±á¬áẠááŸá¬ážááá¯ááºáá±ááá·áº áá±áááºááŸá¯ááŸááºááá»áŸááᯠááŒáá¯ááá¯áá«áááºá C programming ááᯠá¡ááŒááºážáá»ááºáž á áááºáá°ážááŸáááŒá®áž Linux á á¡ááœááºážááá¯ááºážááᯠááŒáá·áºááŸá¯ááá¯áá°áá»á¬ážá¡ááœáẠáááºááœááºáá«áááºá
ááŸááºáá»ááºáá»á¬ážááœáẠáá»áœááºá¯ááºá ááááá¯á¶ážáá±á¬ á
áá¬áž
áá¯ááºáá²á·á 2020 ááŸá¬ ICMP packets ááœá±áá²ááᯠááááºáááᯠpayload áá
áºáá¯ááᯠááá·áºááœááºážááá¯ááºáááºááá¯áᬠáááá¬ááááºá áá«áá±ááá·áº áááºáá±á¬á·á០áá±á¬ááºáá»áᬠááá¯áá±á¬ááºážáá«áááºá ááŒá®ážáá±á¬á· á¡á²áá«áá²á· áááºáááºááŒá®áž áá
áºáá¯áᯠáá¯ááºááá¯ááºáá²á·á¡ááœááºá á¡á²áá«ááᯠáá¯ááºááááºá áá»áœááºá¯ááºááá±á·á
ááºá¡áááºáá¬ááœáẠSSH á¡áá«á¡ááẠcommand line ááᯠá¡áá»á¬ážáá¯á¶ážá¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áº ICMP shell áá
áºáá¯áá
áááºáá°ážááẠáá»áœááºá¯ááºáá
áááºááœáẠááááá¯á¶ážááŒá
áºáá¬áááºá ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ bullshield bingo ááá¯á
á¯á
ááºážáááºá¡ááœáẠáá»áœááºá¯ááºááẠá¡ááŒááºážáá»ááºážá
áááºáá°ážáá¬ááŸááá±á¬ áá¬áá¬á
áá¬ážááŒáá·áº áááºážááᯠLinux module á¡ááŒá
áºáá±ážááẠáá¯á¶ážááŒááºáá²á·áááºá ááá¯ááá¯á·áá±á¬ shell ááá¯áá¯ááºáááºážá
ááºáá»á¬ážá
á¬áááºážááœááºááŒááºááá¯ááºáááºááá¯ááºáá«á áááºáááºáááºážááᯠkernel ááœááºáááºááá¯ááºááŒá®ážáááºážáááºááá¯ááºá
áá
áºááœááºááŸááááá·áºáááºááá¯ááºáá«á áá¬ážáá±á¬ááºááŒááºážá¡áá±á«ááºáá»á¬ážá
á¬áááºážááœááºáá¶ááááŸááá±á¬á¡áá¬ááá¯ááœá±á·áááá·áºáááºááá¯ááºáá«á áááºážáá
áœááºážáá±á¬ááºáááºá¡áá áááºážááẠááŒáá·áºá
á¯á¶áá±á¬ rootkit áá
áºáá¯ááŒá
áºáááºá ááá¯á·áá±á¬áº Load Average ááẠSSH ááŸáááá·áºáááºáá±á¬ááºááẠááŒáá·áºáá¬ážááœááºážááŒá®áž á¡áááºážáá¯á¶ážáá¯ááºáá±á¬ááºááá·áºá¡áá« áááºážááᯠááŒáŸáá·áºáááºááŒá®áž áá±á¬ááºáá¯á¶ážá¡áááºážááŒá±á
áááºážá¡ááŒá
Ạá¡áá¯á¶ážááŒá¯ááẠáá»áŸá±á¬áºááá·áºáá«áááºá echo i > /proc/sysrq-trigger
ááŒááºáááºá
áááºááŒááºážáááŸááá² access ááá¯ááŒááºáááºááá°áááºá
áá»áœááºá¯ááºááá¯á·ááẠPython ááŸáá·áº Cá Google ááŸáá·áº Python ááá¯á·ááœáẠá¡ááŒá±áá¶áááá¯ááááºáá±ážáá¬ážááŒááºážá
áœááºážáááºááᯠá
á¬áá¬ážáááºážááŒááºáá°á¡ááŒá
Ạááá°áá«áááºá
áá±á¬ááºáááºáááº
client á¡ááá¯ááºážá¡ááœáẠá
á¬ááŒá±á¬ááºáž 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()
áá¬ááºááœáŸááºážááẠá¡ááŒá±á¬ááºážááŒáá»ááºááŸá
áºáá¯á ááááºá
á¬áá
áºáá¯ááŸáá·áº payload áá
áºáá¯áá°áááºá áááá¯á·áá®á payload ááẠáá±á¬á·áá
áºáá¯á ááŸá±á·ááœáẠááŸááá±áááºá run:
áá»áááºáž payloads áá»á¬ážááŒáá·áº áááºáá±á·áá»áºáá»á¬ážááᯠáááºáá¯ááºááẠáááºážááᯠáá»áœááºá¯ááºááá¯á· ááá¯á¡ááºáá«áááºá
kernel ááẠpackages áá»á¬ážáááºáá®ážáááºá¡ááœáẠá¡ááœáá·áºáá°ážáá»á¬áž ááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº script ááᯠsuperuser á¡ááŒá
Ạrun ááá«áááºá execution permissions áá±ážááŒá®áž scapy ááá¯ááºááá¯áẠinstall áá¯ááºááẠááá±á·áá«ááŸáá·áºá 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
áá¯á¶á·ááŒááºááŸá¯áááºáá±á·áá»áºááŸá áá±ážáá±á¬ááºááŸá¯ááŸá¬ ááŒá±á¬ááºážáá²ááŒááºážáááŸááá«á
Kernel module
Debian virtual machine áá
áºáá¯ááœáẠáááºáá±á¬ááºááẠá¡áááºážáá¯á¶áž ááá¯á¡ááºáá«áááºá make
О linux-headers-amd64
áá»ááºáá¬ááœá±á ááŸá®ááá¯ááŸá¯áá¯á¶á
á¶áá²á·áá¬áááºá áá±á¬ááºážáá«ážááŸá áá¯ááºáá
áºáá¯áá¯á¶ážááᯠáá»áœááºá¯ááºáá±ážáááºááá¯ááºáá«á áááºááẠáááºážááᯠGithub ááœáẠáá¯á¶áá°ááœá¬ážááá¯ááºáááºá
áá»áááºáááºáááºááŸá¯
á
áááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠmodule ááá¯ááœáá·áºáááºááŸáá·áº áááºážááá¯ááŒá¯ááºáá»áááºá¡ááœáẠáá¯ááºáá±á¬ááºááŸá¯ááŸá
áºáᯠááá¯á¡ááºáá«áááºá Unloading á¡ááœáẠfunction áááá¯á¡ááºáá±ááá·áºá rmmod
áááºážáááºá¡áá¯ááºááá¯ááºáá«á ááááºáá¬ážáá±á¬á¡áá«ááŸáᬠmodule ááá¯ááŒááºááœáá·áºáááá·áºáááºá
#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);
áá®ááŸá¬áá¬ááœá±ááŒá áºáá±áá¬áá²:
- module ááá¯ááºááá¯ááºááŸáá·áº netfilter ááᯠá á®áá¶ááẠáá±á«ááºážá á®ážááá¯ááºááŸá áºáá¯ááᯠááœá²áá¯ááºáá«áááºá
- áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááẠnetfilter ááŸáááá·áºááœá¬ážáááºá áááºážááœááºáá»áááºáá»á¬ážááá¯áááºáááºááŸááºááá¯ááºáááºá áá«ááá¯áá¯ááºááá¯á·á áá»áááºááᯠconfigure áá¯ááºááá·áº ááœá²á·á
ááºážáá¯á¶ááᯠááŒá±áá¬ááá¯á· ááá¯áá«áááºá á¡áá±ážá¡ááŒá®ážáá¯á¶ážá¡áá»ááºááŸá¬ hook á¡ááŒá
áºáá¯ááºáá±á¬ááºááá·áº function ááá¯áááºááŸááºáááºááŒá
áºáááºá
nfho.hook = icmp_cmd_executor;
áá«áá±á¬ááºá០function ááá¯áá±á¬ááºáááá·áºáááºá
ááá¯á·áá±á¬áẠáááºáá±á·áá»áºá¡ááœáẠáá¯ááºáá±á¬ááºáá»áááºááᯠáá»áœááºá¯ááºáááºááŸááºáá¬ážáááº-NF_INET_PRE_ROUTING
kernel ááœááºááááá¯á¶ážáá±á«áºáá¬áá±á¬á¡áá« package ááá¯áá¯ááºáá±á¬ááºáááºáááºááŸááºáááºá áá¯á¶ážááá¯ááºáááºNF_INET_POST_ROUTING
kernel ááŸááœááºáááºááŸáá·áºá¡áá»áŸ packet ááá¯áá¯ááºáá±á¬ááºáááºá
áá« filter ááᯠIPv4 ááá¯á·áááºááŸááºáá¬ážáááºnfho.pf = PF_INET;
.
áá»áœááºá¯ááºááẠáá»áœááºá¯ááºááá»áááºááᯠá¡ááŒáá·áºáá¯á¶ážáŠážá á¬ážáá±ážááŒá áºáááº-nfho.priority = NF_IP_PRI_FIRST;
ááŒá®ážáá±á¬á· áá±áá¬ááœá²á·á ááºážáá¯á¶ááᯠáááá·áºáá»áááºá¡ááŒá ẠááŸááºáá¯á¶áááºááá¯ááºáááºánf_register_net_hook(&init_net, &nfho);
- áá±á¬ááºáá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºááẠáá»áááºááá¯áááºááŸá¬ážáááºá
- Compiler á áááá¯ááºááŒá¬ážááá¯ááºá á±ááẠááá¯ááºá ááºááᯠááŸááºážááŸááºážáááºážáááºáž ááœáŸááºááŒáá¬ážáááºá
- áá¯ááºáááºážáá±á¬ááºáá¬
module_init()
Оmodule_exit()
module ááᯠá áááºáááºááŸáá·áº á¡áá¯á¶ážáááºááẠá¡ááŒá¬ážáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáááºááŸááºáá«á
payload ááá¯ááŒááºáááºááá°ááŒááºážá
ááá¯áá»áœááºá¯ááºááá¯á·ááẠpayload ááá¯áá¯ááºáá°áááºááá¯á¡ááºáááºá áááºážáááºá¡áááºáá²áá¯á¶ážá¡áá¯ááºááŒá áºáá¬áá²á·áááºá kernel ááœáẠpayloads áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠbuilt-in function áá»á¬ážááá«áááºáá«á áááºááẠá¡ááá·áºááŒáá·áº protocols áá»á¬ážá áá±á«ááºážá á®ážáá»á¬ážááá¯áᬠááá¯ááºážááŒá¬ážááá¯ááºáá«áááºá
#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
. áá«ááᯠáá¬ááŒá±á¬áá·áº áááááá»áá» á¡ááŒá±á¬ááºážááŸá¬ compiler á ááá¯ááºááŒá¬ážáá±á¬ááŒá±á¬áá·áºááŒá áºáááºá stack áá²á· heap ááᯠáá¬ážáááºááá¯á·ááá¯áááºá áá áºáá±á·áá»ááẠáá«ááᯠáá±áá»á¬áá¯ááºááŒá®áž áá¯ááºááá¯áá±á¬áẠááŒááºáá±ážáááºááá¯á· áá°ááá¯á·á á¡ááŒá¶ááŒá¯áá¬ážááŒá®ážáá¬ážáá«á áá«áá»ááºáá»ááºáž command áá« á ááºááá·áºááá¯ááºážááá¯áááºááŸááºáá²á·áááºchar cmd_string[MAX_CMD_LEN];
. áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááœáẠááŒááºááá¯ááºááááºá á€á¡ááŒá±á¬ááºážááᯠá¡ááá¯áẠ9 ááœáẠá¡áá±ážá áááºááŒá±á¬ááŒáá«áááºá - ááᯠáá»áœááºá¯ááºááá¯á· á
áááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºááẠ(
struct work_struct my_work;
) ááœá²á·á ááºážáááºáá±á¬ááºááŒá®áž áááºážááᯠá¡ááŒá¬ážáá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááŸáá·áº áá»áááºáááºáá« (DECLARE_WORK(my_work, work_handler);
) áááá¡ááá¯ááºááŸá¬ áá¬á·ááŒá±á¬áá·áº ááá¯á¡ááºááá² ááá¯áá¬ááá¯áááºáž ááŒá±á¬ááŒáá«áááºá - á¡áá¯áá»áœááºáá±á¬áºááŒá±ááŒá¬áá²á· function á áá»áááºááŒá
áºáááá·áºáááºá á¡áá»áá¯ážá¡á
á¬ážááŸáá·áº áááºáá¶áá¬ážáá±á¬ ááŒááºážáá¯á¶ááŸá¯áá»á¬ážááᯠnetfilter á០ááœáŸááºááŒáááºá áá»áœááºá¯ááºááá¯á·áᬠá
áááºáááºá
á¬ážáá«áááºá
skb
. áááºážááẠáááºáááºáá áºáá¯ááŸáá·áºáááºáááºáá±á¬ áááŸáááá¯ááºáá±á¬ á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážáá«áááºááá·áº á¡ááŒá±áá¶áá±áá¬áááºáá±á¬ááºááŸá¯áá áºáá¯ááŒá áºááá·áº socket ááŒá¬ážáá¶áá áºáá¯ááŒá áºáááºá - áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáááºá¡ááœááºá áááºááẠiteration ááŸá
áºáá¯á¡áá«á¡ááẠáááºáá±á¬ááºáá¯á¶ááŸá
áºáá¯ááŸáá·áº variable áá»á¬ážá
áœá¬ ááá¯á¡ááºáááºááŒá
áºáááºá
struct iphdr *iph; struct icmphdr *icmph; unsigned char *user_data; unsigned char *tail; unsigned char *i; int j = 0;
- áá¯áá¹áááá±áááŒáá·áº á
áááºááá¯ááºáááºá module á¡áá¯ááºáá¯ááºáááºá¡ááœáẠICMP Echo ááŸááœá²á á¡ááŒá¬áž packet áá»á¬ážáááá¯á¡ááºáá«á ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠbuilt-in áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒá¬ážáá¶ááá¯ááœá²ááŒááºážá
áááºááŒá¬áᬠICMP ááá¯ááºáá±á¬ ááŸáá·áº Non-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 ááŸáá·áº áááºáááºá áá»áœááºá¯ááºá á¡áááá·áºáá¯á¶áž á¡ááááá¬á áááºáá±á¬ááºážá á áºáá±ážááŸá¯áá»á¬áž áááŸááá²á ááŒá±á¬ááºáááºááœáẠáá áºá á¯á¶áá áºáᬠááŒá áºáá¬ááá¯ááºáááºáᯠáá»áœááºá¯ááºá¡á¬áž ááŒá±á¬ááŒáááºá áá«ááᯠáááºážáá«á·ááᯠáá¬ážááẠáá«áá»á±á¬áºáááºá
- ááᯠPackage ááẠáááºááá¯á¡ááºáá±á¬ á¡áá»áá¯ážá¡á
á¬ážá¡ááá¡áá»ááŒá
áºáá±á¬ááŒá±á¬áá·áº áá±áá¬ááᯠáááºáá¯ááºáá°ááá¯ááºáá«áááºá Built-in áá¯ááºáá±á¬ááºáá»ááºááá«áá²á áááºááẠpayload áá¡á
ááá¯á· ááœáŸááºááŒáá»ááºááᯠáŠážá
áœá¬ááá°ááá«áááºá áááºážááᯠáá
áºáá±áá¬áááºážááœáẠáá¯ááºáá±á¬ááºááŒá®ážá áááºááẠICMP áá±á«ááºážá
á®ážáá¡á
ááá¯á· ááœáŸááºááŒáá»ááºááá¯áá°áᬠáááºážááᯠá€áá±á«ááºážá
á®ážáá¡ááœááºá¡á
á¬ážááá¯á· ááœáŸá±á·ááẠááá¯á¡ááºáááºá á¡á¬ážáá¯á¶ážá ááœá²á·á
ááºážáá¯á¶ááᯠáá¯á¶ážáááºá
icmph
:user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
áá±á«ááºážá á®ážáá¡áá¯á¶ážááẠpayload áá¡áá¯á¶ážááŸáá·áºááá¯ááºáá®ááá«áááºáskb
ááá¯á·ááŒá±á¬áá·áºá áááºááá¯ááºáá¬ááœá²á·á ááºážáá¯á¶ááŸáá»á°ááá®ážáá¬ážáááºážáááºážáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯á áááºážááá¯áá»áœááºá¯ááºááá¯á·áááŸááá«áááºátail = skb_tail_pointer(skb);
.
áá«ááºáá¯á¶ ááá¯ážáá°áá¶ááááºááá®ááŸá¬ , socket ááŒá¬ážáá¶á¡ááŒá±á¬ááºážááá¯ááá¯áááºááŸá¯ááá¯ááºáá«áááºá - ááá·áºááœáẠá¡á
ááŸáá·áºá¡áá¯á¶ážááᯠááœáŸááºááŒááŒá®ážáááºááŸáá·áºá áááºááẠá¡áá»ááºá¡áááºááᯠá
á¬ááŒá±á¬ááºážáá
áºáá¯ááá¯á· áá°ážáá°ááá¯ááºáááºá
cmd_string
á ááŸá±á·áááºáá áºáá¯ááŸááááŸá á á áºáá±ážáá«árun:
ááŸáá·áº áááºáá±á·áá»áº áá»á±á¬ááºáá¯á¶ážáá«á á áœáá·áºáá áºáá« ááá¯á·ááá¯áẠááá¯ááºážááᯠáááºáá¶áá±ážáá¬ážááŒááºážááŒáá·áº á€ááŸá±á·áááºááᯠáááºááŸá¬ážáá«á - áá«áá²á á¡áᯠáááŒá¬áž ááá¯ááºááœááºáá°ááᯠáá±á«áºááá¯ááºáá«ááŒá®-
schedule_work(&my_work);
. ááá¯ááá¯á·áá±á¬áá±á«áºááá¯ááŸá¯áá®ááá¯á· ááá·áºáááºáá±á¬ááºáá áºáá¯ááᯠáá»á±á¬áºááŒááºááẠáááŒá áºááá¯ááºáá±á¬ááŒá±á¬áá·áºá á¡áááá·áºáá±ážááá·áºá á¬ááŒá±á¬ááºážááẠáááá¯áááºááŒá áºááá«áááºáschedule_work()
ááŒá®ážááŒá±á¬ááºááá·áºááœá²á·á ááºážáá¯á¶ááŸáá·áºáááºá ááºááá·áºáá¯ááºáá±á¬ááºáá»ááºááᯠá¡áá¯ááºáá»áááºááá¬ážáá±ážááœá²áá°á á¡ááœá±ááœá±áááºážá á®ááœáẠááá·áºááœááºážááŒá®áž ááŒá®ážááŒá±á¬ááºá á±áá¬á áááºááẠá¡áááá·áºááᯠááŒá®ážááŒá±á¬ááºááẠáá á±á¬áá·áºáá²áá±á á±áááºááŒá áºáááºá áá»áááºááẠá¡ááœááºáá»ááºááŒááºáá±á¬ááŒá±á¬áá·áº ááá¯á¡ááºáá«áááºá ááá¯ááºáá«á ááá·áºááœá±ážáá»ááºááŸá¯ááŸá¬ áááºááá·áºá¡áá¬á០á áááºáááºááá¯áẠááá¯á·ááá¯áẠáááºááẠkernel á¡ááááºáááá·áºááŒá áºááœá¬ážáááºááŒá áºáááºá ááŸá±á¬áá·áºááŸá±ážááŒááºážááẠáá±ááŒááºážááŸáá·áºáá°áá - áá«áá²á áááºááá¯ááºáá²á· ááŒááºááá¯á·ááŸá¯áá²á·á¡áá° á¡áá¯ááºááᯠáááºáá¶ááá¯ááºáá«áááºá
á¡áá¯á¶ážááŒá¯áá°áá±áá¬ááŸá áááá¯ááááºáá áºáá¯ááᯠáá±á«áºááá¯ááŒááºážá
á€áá¯ááºáá±á¬ááºáá»ááºááẠáá¬ážáááºááá¯ááºáá¯á¶ážááŒá
áºáááºá áááºážáá¡áááºááá¯áá±ážáá²á·áááºá DECLARE_WORK()
á¡áá»áá¯ážá¡á
á¬ážááŸáá·áº áááºáá¶áá¬ážáá±á¬ ááŒááºážáá¯á¶ááŸá¯áá»á¬ážááẠá
áááºáááºá
á¬ážááœááºáááŸááá«á áá»áœááºá¯ááºááá¯á·ááẠcommand ááŒáá·áºá
á¬ááŒá±á¬ááºážááá¯áá°ááŒá®áž shell ááá¯áá¯á¶ážáááŒááºáááºážáá«á ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážá binaries ááŸáá·áº á¡ááŒá¬ážá¡áá¬á¡á¬ážáá¯á¶ážááᯠááŸá¬ááœá±ááŒááºážááá¯á·ááᯠááá¯ááºááœááºá
á±áá«á
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);
}
- á¡ááŒááºážá¡áá¯á¶áá»á¬ážááᯠstrings áá»á¬áž array áá
áºáá¯ááá¯á· áááºááŸááºáá«á
argv[]
. áááá¯ááááºáá»á¬ážááᯠá€áááºážááŒáá·áº á¡ááŸááºááááºáá¯ááºáá±á¬ááºááŒá±á¬ááºáž áá°ááá¯ááºážááááŒááŒá®áž spaces ááŸáá·áº á¡áááºáááŒááºááá¯ááºážá¡ááŒá Ạááá¯ááºáá²á - áááºáááºážáá»ááºááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠáááºááŸááºáá«á áá»áœááºá¯ááºááẠáááºážááá¯á·á¡á¬ážáá¯á¶ážááᯠáá±á«ááºážá
ááºááŒá®ážáá¬ážáᯠáá»áŸá±á¬áºááá·áºááŒá®áž á¡áááºážáá¯á¶áž áááºážááŒá±á¬ááºážáá
áºáá¯ááŒáá·áº PATH ááá¯áᬠááá·áºááœááºážáá²á·áááºá
/bin
Ñ/usr/bin
О/sbin
Ñ/usr/sbin
. á¡ááŒá¬ážáááºážáá»á¬ážááẠáááºááœá±á·ááœáẠá¡áá±ážáááŒá®ážáá«á - ááŒá®ážáá«ááŒá®á áá¯ááºááŒáá¡á±á¬ááºá Kernel áá¯ááºáá±á¬ááºáá»ááº
call_usermodehelper()
áááºááœáá·áºáááºáá¶áááºá binary ááá¯á· áááºážááŒá±á¬ááºážá array of argumentsá array of environment variablesá á€áá±áá¬ááœáẠáá®ážááŒá¬ážá¡ááŒááºážá¡áá¯á¶áá áºáá¯á¡ááŒá Ạáá°ááá¯ááºážá executable file ááá¯á·ááœá¬ážááá·áºáááºážááŒá±á¬ááºážáá¡áááá¹áá«ááºááᯠáá¬ážáááºáááºáᯠáá°ááá±á¬áºáááºáž áááºáá±ážááá¯ááºáá«áááºá áá±á¬ááºáá¯á¶ážá¡ááŒááºážá¡áá¯á¶á áá¯ááºáááºážá ááºááŒá®ážá¡á±á¬ááºá á±á¬áá·áºáááá¬ážááá¯áá¬ááᯠáááºááŸááºáá«ááẠ(UMH_WAIT_PROC
) áá¯ááºáááºážá ááºá áááºááŒááºáž (UMH_WAIT_EXEC
) ááá¯á·ááá¯áẠáá¯á¶ážááá á±á¬áá·áºáá« (UMH_NO_WAIT
) áá±á¬ááºáááºááŸááá±ážáá¬ážáUMH_KILLABLE
áá«á á¡á²áá«ááᯠáááŒáá·áºáá°ážá
á¡á ááºážá¡áá±áž
kernel module áá»á¬ážá
á¯áá±ážááŒááºážááᯠkernel make-framework ááŸáááá·áºáá¯ááºáá±á¬ááºáááºá áá±á«áºáááºá make
kernel áá¬ážááŸááºážááŸáá·áº áá»áááºáááºáá¬ážáá±á¬ á¡áá°ážáááºážááœáŸááºáá
áºáá¯á¡ááœááºáž (á€áá±áá¬ááœáẠáááºááŸááºáá¬ážáááº- KERNELDIR:=/lib/modules/$(shell uname -r)/build
) ááŸáá·áº module ááááºáá±áá¬ááᯠvariable ááá¯á·áá±ážááá¯á·áááºá M
á¡ááŒááºážá¡áá¯á¶áá»á¬ážááœááºá icmpshell.ko ááŸáá·áº ááá·áºááŸááºážáá±á¬áá
áºááŸááºáá»á¬ážááẠá€áá°áá±á¬ááºááᯠáá¯á¶ážáá¡áá¯á¶ážááŒá¯áááºá IN obj-m
module áá
áºáá¯á¡ááŒá
áºááá¯á·ááŒá±á¬ááºážáá²ááá·áºá¡áá¬ááá¹áá¯ááá¯ááºááá¯ááœáŸááºááŒáááºá ááŒááºáááºáááºáá®ážáá±ážáá±á¬ Syntax 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
áááºážááœáẠáá±á¬ááºážááá¯áá»ááºáá±ážááá¯á·ááá·áºáááºá
áœá²áá«ááŸááááºá ááá¯ááá¯áááºááŸá¬ áááºážá¡áá¬áá¬ááᯠááŸááºááŸááºáááºáááºáá¯ááºáá²á·ááŒá®áž áá«á¡áá¬áá¬ááᯠááŸááºááŸááºáááºáááºáá¯ááºáá²á·áááºá
áá±á¬ááºáá»ááº
áá»á°ááá®áá¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážáá²á· áááºáááºááŒá®áž áá»áœááºáá±á¬á·áºáá²á· ááááá¯á¶áž á¡ááœá±á·á¡ááŒá¯á¶á áá»áŸá±á¬áºááá·áºáá¬ážáá¬ááẠá¡áá»á¬ážááŒá®áž ááá¯ááœááºáá«áááºá ááœááºááŒá°áᬠá¡ááááºá¡ááŒáœááºáá»á¬ážááŸáá·áº Google ááááºáá»á¬ážááᯠá¡á¬áá¯á¶á
áá¯ááºáᬠC ááœáẠáá®ááœááºáááºáá®ážááŸá¯ á¡ááœá±á·á¡ááŒá¯á¶áááŸáááá·áºááá¯áẠáá»áœááºá¯ááºááẠá¡áá¯ááºáá¯ááºááá·áº module áá
áºáá¯ááᯠáá±ážááá¯ááºáá²á·ááŒá®áž kernel hacker ááŸáá·áº áá
áºáá»áááºáááºážááœáẠscript kiddie áá²á·ááá¯á· áá¶á
á¬ážáá²á·ááááºá ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºá¡áá¯á¶ážááŒá¯áááºááŒá±á¬áá²á·ááá·áº Kernel Newbies áá»ááºáááºááá¯á·ááœá¬ážáá²á·áááºá schedule_work()
áá±á«áºááá·áºá¡á
á¬áž call_usermodehelper()
áá»áááºá¡ááœááºážááœáẠáá°á·áá¬áá¬áá° á¡ááŸááºááœá²áᬠááŸáá·áºá
á¬ážááŸá¯áá
áºáá¯áᯠáá¶ááááŒá
áºáááááºá áá¯ááºááá¯ááºážáá
áºáá¬ááẠáá»áœááºá¯ááºá¡á¬ážáááºáá»áááºá ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠáá
áºáááºááá·áº áá¯ááºáá»áá«áááºá á
áá
áºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á ááŸá¯ááºááœá±ážáááºáá²ááŸá¯ááºááœá±ážááŸá¯ááŸáá·áºáááºáááºááŒá®áž áá»áœááºá¯ááºáááá¯ááºááá¯ááºááá¹áá¬áá®ááᯠáá»ááºáá®ážáá
áºááá·áº á¡á±á¬ááºááŒááºáá±á¬á¡ááœá±á·á¡ááŒá¯á¶áá
áºáá¯á
Github ááœáẠáá¯ááºááŒááºáááºáá¯á¶ážáááºááŒááºážááᯠáá áºá á¯á¶áá áºáŠážá០ááá±á¬áá°áá«á áá»áœááºá¯áẠáá»á±ážáá°ážáááºáá«áááºá á¡áá°ážáááŒáá·áº ááŒáá¯ážááœá±áá²á· á¡áá¯ááºáá¯ááºáá²á·á¡áá« ááá¯ááºáá²áá²á·á¡ááŸá¬ážááœá± á¡áá»á¬ážááŒá®ážáá¯ááºáá²á·áᬠáá±áá»á¬áá«áááºá
source: www.habr.com