TL; рдб: рдо рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЛрдбреНрдпреБрд▓ рд▓реЗрдЦреНрджреИ рдЫреБ рдЬрд╕рд▓реЗ ICMP рдкреЗрд▓реЛрдбрдмрд╛рдЯ рдЖрджреЗрд╢рд╣рд░реВ рдкрдвреНрдЫ рд░ рддрдкрд╛рдИрдВрдХреЛ SSH рдХреНрд░реНрдпрд╛рд╕ рднрдП рддрд╛рдкрдирд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рд░реНрднрд░рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫред рд╕рдмреИрднрдиреНрджрд╛ рдЕрдзреАрд░рдХреЛ рд▓рд╛рдЧрд┐, рд╕рдмреИ рдХреЛрдб рд╣реЛ
рд╕рд╛рд╡рдзрд╛рдиреА рдЕрдиреБрднрд╡реА рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд╣рд░реВ рд░рдЧрддрдХреЛ рдЖрдБрд╕реБ рдлреБрдЯреНрдиреЗ рдЬреЛрдЦрд┐рдо! рдо рд╢рдмреНрджрд╛рд╡рд▓реАрдорд╛ рдЧрд▓рдд рдкрдирд┐ рд╣реБрди рд╕рдХреНрдЫреБ, рддрд░ рдХреБрдиреИ рдкрдирд┐ рдЖрд▓реЛрдЪрдирд╛ рд╕реНрд╡рд╛рдЧрдд рдЫред рдкреЛрд╖реНрдЯ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдзреЗрд░реИ рдирд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдЫ рд░ рд▓рд┐рдирдХреНрд╕ рдХреЛ рднрд┐рддреНрд░реА рдорд╛ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреЗ рдХреЛ рд▓рд╛рдЧреА рд▓рдХреНрд╖рд┐рдд рдЫред
рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдЯрд┐рдкреНрдкрдгреА рдорд╛
рд╣реЛ, реирежреиреж рдорд╛ рдореИрд▓реЗ рд╕рд┐рдХреЗрдВ рдХрд┐ рддрдкрд╛рдИрд▓реЗ ICMP рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдорд╛ рдордирдорд╛рдиреА рдкреЗрд▓реЛрдб рдШреБрд╕рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рддрд░ рдХрд╣рд┐рд▓реНрдпреИ рднрдиреНрджрд╛ рдврд┐рд▓реЛ рд░рд╛рдореНрд░реЛ! рд░ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣рд┐ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддреНрдпрд╕реЛрднрдП рдпреЛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдореЗрд░реЛ рджреИрдирд┐рдХ рдЬреАрд╡рдирдорд╛ рдо рдкреНрд░рд╛рдпрдГ рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБ, SSH рдорд╛рд░реНрдлрдд, ICMP рд╢реЗрд▓рдХреЛ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЛ рджрд┐рдорд╛рдЧрдорд╛ рдкрд╣рд┐рд▓реЗ рдЖрдпреЛред рд░ рдкреВрд░реНрдг рдмреБрд▓рд╢рд┐рд▓реНрдб рдмрд┐рдВрдЧреЛ рдЬрдореНрдорд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд▓рд┐рдирдХреНрд╕ рдореЛрдбреНрдпреБрд▓рдХреЛ рд░реВрдкрдорд╛ рдПрдЙрдЯрд╛ рднрд╛рд╖рд╛рдорд╛ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ рдЬреБрди рдорд╕рдБрдЧ рдорд╛рддреНрд░ рдХреБрдиреИ рдирд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдЫред рдпрд╕реНрддреЛ рд╢реЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдорд╛ рджреЗрдЦрд┐рдиреЗрдЫреИрди, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдХрд░реНрдиреЗрд▓рдорд╛ рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдпреЛ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рд╣реБрдиреЗрдЫреИрди, рддрдкрд╛рдЗрдБрд▓реЗ рд╕реБрдиреНрдиреЗ рдкреЛрд░реНрдЯрд╣рд░реВрдХреЛ рд╕реВрдЪреАрдорд╛ рдХреЗрд╣рд┐ рд╕рдВрджрд┐рдЧреНрдз рджреЗрдЦреНрдиреБрд╣реБрдиреЗ рдЫреИрдиред рдпрд╕рдХреЛ рдХреНрд╖рдорддрд╛рд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпреЛ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд░реВрдЯрдХрд┐рдЯ рд╣реЛ, рддрд░ рдо рдпрд╕рд▓рд╛рдИ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд░ SSH рдорд╛рд░реНрдлрдд рд▓рдЧ рдЗрди рдЧрд░реНрди рд░ рдХрдореНрддрд┐рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд▓реЛрдб рдФрд╕рдд рдзреЗрд░реИ рдЙрдЪреНрдЪ рд╣реБрдБрджрд╛ рдпрд╕рд▓рд╛рдИ рдЕрдиреНрддрд┐рдо рдЙрдкрд╛рдпрдХреЛ рд╢реЗрд▓рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЖрд╢рд╛ рдЧрд░реНрджрдЫреБред 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:
, рд╣рд╛рдореАрд▓рд╛рдИ рдЕрдирд┐рдпрдорд┐рдд рдкреЗрд▓реЛрдбрд╣рд░реВрд╕рдБрдЧ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдмрд╣рд┐рд╖реНрдХрд╛рд░ рдЧрд░реНрди рдпрд╕рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реБрдиреЗрдЫред
рдХрд░реНрдиреЗрд▓рд▓рд╛рдИ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдХреНрд░рд╛рдлреНрдЯ рдЧрд░реНрди рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрдкрд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрдиреБ рдкрд░реНрдЫред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрдорддрд┐ рджрд┐рди рд░ 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);
рдпрд╣рд╛рдБ рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ:
- рдореЛрдбреНрдпреБрд▓ рд░ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░рд▓рд╛рдИ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрди рджреБрдИ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рддрд╛рдирд┐рдиреНрдЫрдиреНред
- рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░ рдорд╛рд░реНрдлрдд рдЬрд╛рдиреНрдЫрдиреН, рддрдкрд╛рдЗрдБ рдпрд╕рдорд╛ рд╣реБрдХрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рд╣реБрдХ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдиреЗ рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рдгрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреБрд░рд╛ рднрдиреЗрдХреЛ рд╣реБрдХрдХреЛ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗ рдкреНрд░рдХрд╛рд░реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБ рд╣реЛ:
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);
)ред рдо рдирд╡реМрдВ рдЕрдиреБрдЪреНрдЫреЗрджрдорд╛ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рдкрдирд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред - рдЕрдм рдо рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рдШреЛрд╖рдгрд╛ рдЧрд░реНрдЫреБ, рдЬреБрди рд╣реБрдХ рд╣реБрдиреЗрдЫред рдкреНрд░рдХрд╛рд░ рд░ рд╕реНрд╡реАрдХреГрдд рддрд░реНрдХрд╣рд░реВ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реБрдиреНрдЫрдиреН, рд╣рд╛рдореА рдорд╛рддреНрд░ рдЗрдЪреНрдЫреБрдХ рдЫреМрдВ
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; }
рдЖрдИрдкреА тАЛтАЛрд╣реЗрдбрд░рд╣рд░реВ рдЬрд╛рдБрдЪ рдирдЧрд░реА рдХреЗ рд╣реБрдиреНрдЫ рднрдиреЗрд░ рдореИрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдЧрд░реЗрдХреЛ рдЫреИрдиред 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
рд░ рдпрд╕рдорд╛ рдЕрдиреБрд░реЛрдз рдкрдард╛рдЗрдПрдХреЛ рдорд┐рддрд┐ рд╕рдорд╛рд╡реЗрд╢ рдЫ, рдЬрд╕рдХреЛ рдорддрд▓рдм рддрдкрд╛рдИрдВрд▓реЗ рд╕рдмреИ рдареАрдХ рдЧрд░реНрдиреБрднрдпреЛ рд░ рдореИрд▓реЗ рд╕рдмреИ рдареАрдХ рдЧрд░реЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рдЖрдгрд╡рд┐рдХ рд╡рд┐рдХрд╛рд╕рдХреЛ рд╕рд╛рде рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдЕрдиреБрднрд╡ рдореИрд▓реЗ рд╕реЛрдЪреЗ рднрдиреНрджрд╛ рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдерд┐рдпреЛред рд╕реА рдорд╛ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдЕрдиреБрднрд╡ рдмрд┐рдирд╛ рдкрдирд┐, рдХрдореНрдкрд╛рдЗрд▓рд░ рд╕рдВрдХреЗрддрд╣рд░реВ рд░ рдЧреБрдЧрд▓ рдкрд░рд┐рдгрд╛рдорд╣рд░реВрдорд╛ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдЧрд░реНрджреИ, рдореИрд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗ рдореЛрдбреНрдпреБрд▓ рд▓реЗрдЦреНрди рд░ рдХрд░реНрдиреЗрд▓ рд╣реНрдпрд╛рдХрд░ рдЬрд╕реНрддреЛ рдорд╣рд╕реБрд╕ рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдБ, рд░ рдПрдХреИ рд╕рдордпрдорд╛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдбреАред рдердк рд░реВрдкрдорд╛, рдо рдХрд░реНрдиреЗрд▓ рдиреНрдпреВрдмреАрдЬ рдЪреНрдпрд╛рдирд▓рдорд╛ рдЧрдПрдБ, рдЬрд╣рд╛рдБ рдорд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рднрдирд┐рдПрдХреЛ рдерд┐рдпреЛ schedule_work()
рдХрд▓ рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ call_usermodehelper()
рд╣реБрдХ рднрд┐рддреНрд░ рдЖрдлреИрдВ рд░ рдЙрд╕рд▓рд╛рдИ рд▓рд╛рдЬ рдорд╛рдиреНрдиреБрднрдпреЛ, рд╕рд╣реА рд░реВрдкрдорд╛ рдПрдХ рдШреЛрдЯрд╛рд▓рд╛ рд╢рдВрдХрд╛ред рдХреЛрдбрдХреЛ рд╕рдп рд▓рд╛рдЗрдирд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдореЗрд░реЛ рдЦрд╛рд▓реА рд╕рдордпрдорд╛ рд╡рд┐рдХрд╛рд╕рдХреЛ рдПрдХ рд╣рдкреНрддрд╛ рдЦрд░реНрдЪ рдЧрд░реНрдЫред рдПрдХ рд╕рдлрд▓ рдЕрдиреБрднрд╡ рдЬрд╕рд▓реЗ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╛рд╕рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдореЗрд░реЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдорд┐рдердХрд▓рд╛рдИ рдирд╖реНрдЯ рдЧрд░реНрдпреЛред
рдпрджрд┐ рдХреЛрд╣реА Github рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдЧрд░реНрди рд╕рд╣рдордд рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдо рдЖрднрд╛рд░реА рд╣реБрдиреЗрдЫреБред рдо рдкрдХреНрдХрд╛ рдЫреБ рдХрд┐ рдореИрд▓реЗ рдзреЗрд░реИ рдмреЗрд╡рдХреВрдл рдЧрд▓реНрддреАрд╣рд░реВ рдЧрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИред
рд╕реНрд░реЛрдд: www.habr.com