TL; DR: ΠΠΈΡΠ° ΠΌΠΎΠ΄ΡΠ» Π½Π° ΡΠ΄ΡΠΎΡΠΎ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΎΡ ICMP ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ ΡΠΎΠ²Π°Ρ ΠΈ ΡΠ΅ Π³ΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π½Π° ΡΡΡΠ²ΡΡΠ°, Π΄ΠΎΡΠΈ Π°ΠΊΠΎ Π²Π°ΡΠΈΡΡ SSH ΡΠ΅ ΡΡΠΈΠ½Π΅. ΠΠ° Π½Π°ΠΉ-Π½Π΅ΡΡΡΠΏΠ΅Π»ΠΈΠ²ΠΈΡΠ΅, ΡΠ΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ Π΅
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅! ΠΠΏΠΈΡΠ½ΠΈΡΠ΅ C ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈ ΡΠΈΡΠΊΡΠ²Π°Ρ Π΄Π° ΠΈΠ·Π±ΡΡ Π½Π°Ρ Π² ΠΊΡΡΠ²Π°Π²ΠΈ ΡΡΠ»Π·ΠΈ! ΠΠΎΠΆΠ΅ Π΄ΠΎΡΠΈ Π΄Π° Π³ΡΠ΅ΡΠ° Π² ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ°, Π½ΠΎ Π²ΡΡΠΊΠ° ΠΊΡΠΈΡΠΈΠΊΠ° Π΅ Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»Π°. ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΡΡΠ±Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° C ΠΈ ΠΈΡΠΊΠ°Ρ Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π°Ρ Π² Π²ΡΡΡΠ΅ΡΠ½ΠΎΡΡΡΠ° Π½Π° Linux.
Π ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΠΊΡΠΌ ΠΏΡΡΠ²ΠΈΡ ΠΌΠΈ
ΠΠ°, ΠΏΡΠ΅Π· 2020 Π³. Π½Π°ΡΡΠΈΡ
, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΌΡΠΊΠ½Π΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΡΠΎΠ²Π°Ρ Π² ICMP ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΊΡΡΠ½ΠΎ ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π½ΠΈΠΊΠΎΠ³Π°! Π ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΠΎ Π²ΡΠΏΡΠΎΡΠ°, Π·Π½Π°ΡΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅ΡΠΎ ΡΠΈ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΠΏΡΠ΅Π· SSH, ΠΏΡΡΠ²ΠΎ ΠΌΠΈ Ρ
ΡΡΠΌΠ½Π° ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ICMP shell. Π Π·Π° Π΄Π° ΡΠ³Π»ΠΎΠ±Ρ ΡΡΠ»ΠΎΡΡΠ½ΠΎ Π±ΠΈΠ½Π³ΠΎ Π·Π° Π±ΠΈΠΊΠΎΠ²Π΅, ΡΠ΅ΡΠΈΡ
Π΄Π° Π³ΠΎ Π½Π°ΠΏΠΈΡΠ° ΠΊΠ°ΡΠΎ Linux ΠΌΠΎΠ΄ΡΠ» Π½Π° Π΅Π·ΠΈΠΊ, Π·Π° ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ°ΠΌ ΡΠ°ΠΌΠΎ Π³ΡΡΠ±Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π°. Π’Π°ΠΊΠ°Π²Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π²ΠΈΠΆΠ΄Π° Π² ΡΠΏΠΈΡΡΠΊΠ° Ρ ΠΏΡΠΎΡΠ΅ΡΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Ρ Π·Π°ΡΠ΅Π΄ΠΈΡΠ΅ Π² ΡΠ΄ΡΠΎΡΠΎ ΠΈ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠ² ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, Π½ΡΠΌΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π½ΠΈΡΠΎ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»Π½ΠΎ Π² ΡΠΏΠΈΡΡΠΊΠ° Ρ ΡΠ»ΡΡΠ°ΡΠΈ ΠΏΠΎΡΡΠΎΠ²Π΅. ΠΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠΈ, ΡΠΎΠ²Π° Π΅ ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π΅Π½ ΡΡΡΠΊΠΈΡ, Π½ΠΎ ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌ Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΡ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΊΠ°ΡΠΎ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ΅Π΄Π½ΠΎΡΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π΅ ΡΠ²ΡΡΠ΄Π΅ Π²ΠΈΡΠΎΠΊΠΎ, Π·Π° Π΄Π° Π²Π»Π΅Π·Π΅ΡΠ΅ ΠΏΡΠ΅Π· 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);
ΠΠ°ΠΊΠ²ΠΎ ΡΡΠ°Π²Π° ΡΡΠΊ:
- ΠΠ²Π° Π·Π°Π³Π»Π°Π²Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΡΡ, Π·Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°Ρ ΡΠ°ΠΌΠΈΡ ΠΌΠΎΠ΄ΡΠ» ΠΈ 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()
Π·Π°Π΄Π°ΠΉΡΠ΅ Π΄ΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π°.
ΠΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ ΡΠΎΠ²Π°Ρ
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΈΡ ΡΠΎΠ²Π°Ρ, ΡΠΎΠ²Π° ΡΠ΅ ΠΎΠΊΠ°Π·Π° Π½Π°ΠΉ-ΡΡΡΠ΄Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ°. Π―Π΄ΡΠΎΡΠΎ Π½ΡΠΌΠ° Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΡΠΎΠ²Π°ΡΠΈ; ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π°Π³Π»Π°Π²ΠΊΠΈ Π½Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΈ ΠΎΡ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ.
#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 ΠΈ clean ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠ·ΡΡΠ»ΠΎ ΡΠ°Π·ΠΈ ΡΠ°ΠΌΠΊΠ°. 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, ΡΡΠΏΡΡ
Π΄Π° Π½Π°ΠΏΠΈΡΠ° ΡΠ°Π±ΠΎΡΠ΅Ρ ΠΌΠΎΠ΄ΡΠ» ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ²ΡΡΠ²Π°ΠΌ ΠΊΠ°ΡΠΎ Ρ
Π°ΠΊΠ΅Ρ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ Π² ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄Π΅ΡΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΎΡΠΈΠ΄ΠΎΡ
Π² ΠΊΠ°Π½Π°Π»Π° Π½Π° Kernel Newbies, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΈ ΠΊΠ°Π·Π°Ρ
Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ schedule_work()
Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΡΠ΅ ΠΎΠ±Π°Π΄Ρ call_usermodehelper()
Π²ΡΡΡΠ΅ Π² ΡΠ°ΠΌΠ°ΡΠ° ΠΊΡΠΊΠ° ΠΈ Π³ΠΎ Π·Π°ΡΡΠ°ΠΌΠΈ, Ρ ΠΏΡΠ°Π²ΠΎ ΠΏΠΎΠ΄ΠΎΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΈΠ·ΠΌΠ°ΠΌΠ°. Π‘ΡΠΎ ΡΠ΅Π΄Π° ΠΊΠΎΠ΄ ΠΌΠΈ ΡΡΡΡΠ²Π°Ρ
Π° ΠΎΠΊΠΎΠ»ΠΎ ΡΠ΅Π΄ΠΌΠΈΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΡΠΎ ΠΌΠΈ Π²ΡΠ΅ΠΌΠ΅. Π£ΡΠΏΠ΅ΡΠ΅Π½ ΠΎΠΏΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΡΡΡΠΈ ΠΌΠΎΡ Π»ΠΈΡΠ΅Π½ ΠΌΠΈΡ Π·Π° ΠΎΠ³ΡΠΎΠΌΠ½Π°ΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
ΠΠΊΠΎ Π½ΡΠΊΠΎΠΉ ΡΠ΅ ΡΡΠ³Π»Π°ΡΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄Π° Π² Github, ΡΠ΅ ΡΡΠΌ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½. ΠΠΎΡΡΠΈ ΡΡΠΌ ΡΠΈΠ³ΡΡΠ΅Π½, ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡΠΏΠ°Π²ΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠ΅Ρ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com