TL, рдбреЙ: рдореИрдВ рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ ICMP рдкреЗрд▓реЛрдб рд╕реЗ рдХрдорд╛рдВрдб рдкрдврд╝реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдЖрдкрдХрд╛ SSH рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПред рд╕рдмрд╕реЗ рдЕрдзреАрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдХреЛрдб рд╣реИрдВ
рдЪреЗрддрд╛рд╡рдиреА! рдЕрдиреБрднрд╡реА рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЦреВрди рдХреЗ рдЖрдВрд╕реВ рдмрд╣рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддреЗ рд╣реИрдВ! рдореИрдВ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЧрд▓рдд рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдмрд╣реБрдд рдореЛрдЯрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рд╡реЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ
рд╣рд╛рдВ, 2020 рдореЗрдВ рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдЖрдк ICMP рдкреИрдХреЗрдЯ рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рдкреЗрд▓реЛрдб рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрднреА рдирд╣реАрдВ рд╕реЗ рджреЗрд░ рд╕реЗ рд╣реА рд╕рд╣реА! рдФрд░ рдЪреВрдБрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрдкрдиреЗ рджреИрдирд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдореИрдВ рдЕрдХреНрд╕рд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрд╕рдПрд╕рдПрдЪ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдИрд╕реАрдПрдордкреА рд╢реЗрд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдФрд░ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдмреБрд▓рд╢реАрд▓реНрдб рдмрд┐рдВрдЧреЛ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рдореЛрдЯрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдРрд╕рд╛ рд╢реЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛, рдЖрдк рдЗрд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЖрдкрдХреЛ рд╢реНрд░рд╡рдг рдкреЛрд░реНрдЯ рдХреА рд╕реВрдЪреА рдореЗрдВ рдХреБрдЫ рднреА рд╕рдВрджрд┐рдЧреНрдз рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдПрдХ рдкреВрд░реНрдг рд░реВрдЯрдХрд┐рдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд╢реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдЬрдм рд▓реЛрдб рдФрд╕рдд рдПрд╕рдПрд╕рдПрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛред echo i > /proc/sysrq-trigger
рд░рд┐рдмреВрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдкрд╣реБрдВрдЪ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╣рдо рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░, рдкрд╛рдпрдерди рдФрд░ рд╕реА, рдЧреВрдЧрд▓ рдФрд░ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреМрд╢рд▓ рд▓реЗрддреЗ рд╣реИрдВ
рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрднрдЧ 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:
, рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреЗрд▓реЛрдб рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреИрдХреЗрдЬ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реБрдкрд░рдпреВрдЬрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдорддрд┐рдпрд╛рдБ рджреЗрдирд╛ рдФрд░ рд╕реНрдХреИрдкреА рдХреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдбреЗрдмрд┐рдпрди рдирд╛рдордХ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ 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);
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
- рдореЙрдбреНрдпреВрд▓ рдФрд░ рдиреЗрдЯрдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИрдВред
- рд╕рднреА рдСрдкрд░реЗрд╢рди рдиреЗрдЯрдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдореЗрдВ рд╣реБрдХ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣реБрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣реБрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
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;
}
рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
- рдЗрд╕ рдмрд╛рд░ рдЖрдИрдкреА рдФрд░ рдЖрдИрд╕реАрдПрдордкреА рд╣реЗрдбрд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреА рдкрдбрд╝реАрдВред
- рдореИрдВрдиреЗ рдЕрдзрд┐рдХрддрдо рд▓рд╛рдЗрди рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИ:
#define MAX_CMD_LEN 1976
. рдЖрдЦрд╝рд┐рд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ! рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕реНрдЯреИрдХ рдФрд░ рд╣реАрдк рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдХрд┐рд╕реА рджрд┐рди рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╢рд╛рдпрдж рдХреЛрдб рдХреЛ рднреА рд╕рд╣реА рдХрд░ рджреВрдВрдЧрд╛ред рдореИрдВрдиреЗ рддреБрд░рдВрдд рд╡рд╣ рд▓рд╛рдЗрди рд╕реЗрдЯ рдХреА рдЬрд┐рд╕рдореЗрдВ рдХрдорд╛рдВрдб рд╣реЛрдЧреА:char cmd_string[MAX_CMD_LEN];
. рдпрд╣ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП; рдореИрдВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл 9 рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред - рдЕрдм рд╣рдореЗрдВ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (
struct work_struct my_work;
) рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ (DECLARE_WORK(my_work, work_handler);
). рдиреМрд╡реЗрдВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдпрд╣ рднреА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ. - рдЕрдм рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рд╣реБрдХ рд╣реЛрдЧрд╛ред рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕реНрд╡реАрдХреГрдд рддрд░реНрдХ рдиреЗрдЯрдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ
skb
. рдпрд╣ рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░ рд╣реИ, рдПрдХ рдореМрд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред - рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдХрдИ рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
struct iphdr *iph; struct icmphdr *icmph; unsigned char *user_data; unsigned char *tail; unsigned char *i; int j = 0;
- рд╣рдо рддрд░реНрдХ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ICMP рдЗрдХреЛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрдХреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдлрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдЧреИрд░-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; }
рдореИрдВрдиреЗ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдИрдкреА рд╣реЗрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рди рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднрдпрд╛рдирдХ рдШрдЯрд┐рдд рд╣реЛрдирд╛ рддрдп рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдордирд╛ рдХрд░реЗрдВрдЧреЗ рддреЛ рдореБрдЭреЗ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА!
- рдЕрдм рдЬрдм рдкреИрдХреЗрдЬ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреЗрд▓реЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ 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 рдФрд░ рдХреНрд▓реАрди рд▓рдХреНрд╖реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореЗрдВ 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
рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреА рддрд╛рд░реАрдЦ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд┐рдпрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдкрд░рдорд╛рдгреБ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрднрд╡ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди рдерд╛ред рд╕реА рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд┐рдирд╛ рднреА, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрдХреЗрддреЛрдВ рдФрд░ Google рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдФрд░ рдПрдХ рдХрд░реНрдиреЗрд▓ рд╣реИрдХрд░ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдФрд░ рд╕рд╛рде рд╣реА рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдбреА рднреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХрд░реНрдиреЗрд▓ рдиреНрдпреВрдмреАрдЬ рдЪреИрдирд▓ рдкрд░ рдЧрдпрд╛, рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ schedule_work()
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп call_usermodehelper()
рд╣реБрдХ рдХреЗ рдЕрдВрджрд░ рд╣реА рдФрд░ рдШреЛрдЯрд╛рд▓реЗ рдХрд╛ рд╕рдВрджреЗрд╣ рдХрд░рддреЗ рд╣реБрдП рдЙрд╕реЗ рд╢рд░реНрдорд┐рдВрджрд╛ рдХрд┐рдпрд╛ред рдХреЛрдб рдХреА рд╕реМ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореБрдЭреЗ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рдЦрд░реНрдЪ рдЙрдард╛рдирд╛ рдкрдбрд╝рд╛ред рдПрдХ рд╕рдлрд▓ рдЕрдиреБрднрд╡ рдЬрд┐рд╕рдиреЗ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╛рд╕ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдорд┐рдердХ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ред
рдпрджрд┐ рдХреЛрдИ рдЬреАрдердм рдкрд░ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕реА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВ, рдЦрд╛рд╕рдХрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордпред
рд╕реНрд░реЛрдд: www.habr.com