ICMP рдорд╛ рдЖрдгрд╡рд┐рдХ рдЦреЛрд▓

ICMP рдорд╛ рдЖрдгрд╡рд┐рдХ рдЦреЛрд▓

TL; рдб: рдо рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЛрдбреНрдпреБрд▓ рд▓реЗрдЦреНрджреИ рдЫреБ рдЬрд╕рд▓реЗ ICMP рдкреЗрд▓реЛрдбрдмрд╛рдЯ рдЖрджреЗрд╢рд╣рд░реВ рдкрдвреНрдЫ рд░ рддрдкрд╛рдИрдВрдХреЛ SSH рдХреНрд░реНрдпрд╛рд╕ рднрдП рддрд╛рдкрдирд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рд░реНрднрд░рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫред рд╕рдмреИрднрдиреНрджрд╛ рдЕрдзреАрд░рдХреЛ рд▓рд╛рдЧрд┐, рд╕рдмреИ рдХреЛрдб рд╣реЛ github.

рд╕рд╛рд╡рдзрд╛рдиреА рдЕрдиреБрднрд╡реА рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд╣рд░реВ рд░рдЧрддрдХреЛ рдЖрдБрд╕реБ рдлреБрдЯреНрдиреЗ рдЬреЛрдЦрд┐рдо! рдо рд╢рдмреНрджрд╛рд╡рд▓реАрдорд╛ рдЧрд▓рдд рдкрдирд┐ рд╣реБрди рд╕рдХреНрдЫреБ, рддрд░ рдХреБрдиреИ рдкрдирд┐ рдЖрд▓реЛрдЪрдирд╛ рд╕реНрд╡рд╛рдЧрдд рдЫред рдкреЛрд╖реНрдЯ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдзреЗрд░реИ рдирд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдЫ рд░ рд▓рд┐рдирдХреНрд╕ рдХреЛ рднрд┐рддреНрд░реА рдорд╛ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреЗ рдХреЛ рд▓рд╛рдЧреА рд▓рдХреНрд╖рд┐рдд рдЫред

рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рдЯрд┐рдкреНрдкрдгреА рдорд╛ рд▓реЗрдЦ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ SoftEther VPN, рдЬрд╕рд▓реЗ рдХреЗрд╣рд┐ "рдирд┐рдпрдорд┐рдд" рдкреНрд░реЛрдЯреЛрдХрд▓рд╣рд░реВрдХреЛ рдирдХреНрдХрд▓ рдЧрд░реНрди рд╕рдХреНрдЫ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА HTTPS, ICMP рд░ DNS рдорд╛ред рдо рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдкрд╣рд┐рд▓реЛ рдХрд╛рдо рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрди рд╕рдХреНрдЫреБ, рдХрд┐рдирдХрд┐ рдо HTTP(S) рд╕рдБрдЧ рдзреЗрд░реИ рдкрд░рд┐рдЪрд┐рдд рдЫреБ, рд░ рдореИрд▓реЗ ICMP рд░ DNS рдорд╛ рдЯрдиреЗрд▓рд┐рдЩ рд╕рд┐рдХреНрдиреБрдкрд░реНтАНрдпреЛред

ICMP рдорд╛ рдЖрдгрд╡рд┐рдХ рдЦреЛрд▓

рд╣реЛ, реирежреиреж рдорд╛ рдореИрд▓реЗ рд╕рд┐рдХреЗрдВ рдХрд┐ рддрдкрд╛рдИрд▓реЗ ICMP рдкреНрдпрд╛рдХреЗрдЯрд╣рд░реВрдорд╛ рдордирдорд╛рдиреА рдкреЗрд▓реЛрдб рдШреБрд╕рд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рддрд░ рдХрд╣рд┐рд▓реНрдпреИ рднрдиреНрджрд╛ рдврд┐рд▓реЛ рд░рд╛рдореНрд░реЛ! рд░ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣рд┐ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддреНрдпрд╕реЛрднрдП рдпреЛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдореЗрд░реЛ рджреИрдирд┐рдХ рдЬреАрд╡рдирдорд╛ рдо рдкреНрд░рд╛рдпрдГ рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБ, SSH рдорд╛рд░реНрдлрдд, ICMP рд╢реЗрд▓рдХреЛ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЛ рджрд┐рдорд╛рдЧрдорд╛ рдкрд╣рд┐рд▓реЗ рдЖрдпреЛред рд░ рдкреВрд░реНрдг рдмреБрд▓рд╢рд┐рд▓реНрдб рдмрд┐рдВрдЧреЛ рдЬрдореНрдорд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд▓рд┐рдирдХреНрд╕ рдореЛрдбреНрдпреБрд▓рдХреЛ рд░реВрдкрдорд╛ рдПрдЙрдЯрд╛ рднрд╛рд╖рд╛рдорд╛ рд▓реЗрдЦреНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ рдЬреБрди рдорд╕рдБрдЧ рдорд╛рддреНрд░ рдХреБрдиреИ рдирд░рд╛рдореНрд░реЛ рд╡рд┐рдЪрд╛рд░ рдЫред рдпрд╕реНрддреЛ рд╢реЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдорд╛ рджреЗрдЦрд┐рдиреЗрдЫреИрди, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдХрд░реНрдиреЗрд▓рдорд╛ рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рдпреЛ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рд╣реБрдиреЗрдЫреИрди, рддрдкрд╛рдЗрдБрд▓реЗ рд╕реБрдиреНрдиреЗ рдкреЛрд░реНрдЯрд╣рд░реВрдХреЛ рд╕реВрдЪреАрдорд╛ рдХреЗрд╣рд┐ рд╕рдВрджрд┐рдЧреНрдз рджреЗрдЦреНрдиреБрд╣реБрдиреЗ рдЫреИрдиред рдпрд╕рдХреЛ рдХреНрд╖рдорддрд╛рд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рдпреЛ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд░реВрдЯрдХрд┐рдЯ рд╣реЛ, рддрд░ рдо рдпрд╕рд▓рд╛рдИ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд░ SSH рдорд╛рд░реНрдлрдд рд▓рдЧ рдЗрди рдЧрд░реНрди рд░ рдХрдореНрддрд┐рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд▓реЛрдб рдФрд╕рдд рдзреЗрд░реИ рдЙрдЪреНрдЪ рд╣реБрдБрджрд╛ рдпрд╕рд▓рд╛рдИ рдЕрдиреНрддрд┐рдо рдЙрдкрд╛рдпрдХреЛ рд╢реЗрд▓рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЖрд╢рд╛ рдЧрд░реНрджрдЫреБред echo i > /proc/sysrq-triggerрд░рд┐рдмреБрдЯ рдирдЧрд░реА рдкрд╣реБрдБрдЪ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиред

рд╣рд╛рдореА рдкрд╛рдЗрдерди рд░ рд╕реА, рдЧреБрдЧрд▓ рд░ рдорд╛ рдкрд╛рда рд╕рдореНрдкрд╛рджрдХ, рдЖрдзрд╛рд░рднреВрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рдХреМрд╢рд▓ рд▓рд┐рдиреНрдЫреМрдВ рднрд░реНрдЪреБрдЕрд▓ рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдЯреБрдЯреНрдпреЛ рднрдиреЗ (рд╡реИрдХрд▓реНрдкрд┐рдХ - рд╕реНрдерд╛рдиреАрдп VirtualBox/KVM/etc) рдЪрдХреНрдХреБ рдореБрдирд┐ рд░рд╛рдЦреНрди рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХреБрдиреИ рдЖрдкрддреНрддрд┐ рдЫреИрди рд░ рдЬрд╛рдФрдВ!

рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖

рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдереНрдпреЛ рдХрд┐ рдХреНрд▓рд╛рдЗрдиреНрдЯрдХреЛ рднрд╛рдЧрдХреЛ рд▓рд╛рдЧрд┐ рдореИрд▓реЗ рд▓рдЧрднрдЧ 80 рд▓рд╛рдЗрдирд╣рд░реВрд╕рдБрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреНрдиреБрдкрд░реНрдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рджрдпрд╛рд▓реБ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рдерд┐рдП рдЬрд╕рд▓реЗ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдЧрд░реЗред рд╕рдмреИ рдХрд╛рдоред рдХреЛрдб рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдкрдорд╛ рд╕рд░рд▓ рднрдпреЛ, 10 рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд░реЗрдЦрд╛рд╣рд░реВрдорд╛ рдлрд┐рдЯрд┐рдВрдЧ:

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);

рдпрд╣рд╛рдБ рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ:

  1. рдореЛрдбреНрдпреБрд▓ рд░ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░рд▓рд╛рдИ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрди рджреБрдИ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рддрд╛рдирд┐рдиреНрдЫрдиреНред
  2. рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░ рдорд╛рд░реНрдлрдд рдЬрд╛рдиреНрдЫрдиреН, рддрдкрд╛рдЗрдБ рдпрд╕рдорд╛ рд╣реБрдХрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рд╣реБрдХ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдиреЗ рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рдгрд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреБрд░рд╛ рднрдиреЗрдХреЛ рд╣реБрдХрдХреЛ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗ рдкреНрд░рдХрд╛рд░реНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБ рд╣реЛ: 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);
  3. рдЕрдиреНрддрд┐рдо рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рд╣реБрдХ рд╣рдЯрд╛рдЙрдБрдЫред
  4. рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ рддрд╛рдХрд┐ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рдЧреБрдирд╛рд╕реЛ рдЧрд░реНрджреИрдиред
  5. рдХрд╛рд░реНрдпрд╣рд░реВ 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;
}

рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ:

  1. рдореИрд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ, рдпреЛ рдкрдЯрдХ IP рд░ ICMP рд╣реЗрдбрд░рд╣рд░реВ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрдиред
  2. рдореИрд▓реЗ рдЕрдзрд┐рдХрддрдо рд░реЗрдЦрд╛ рд▓рдореНрдмрд╛рдЗ рд╕реЗрдЯ рдЧрд░реЗрдВ: #define MAX_CMD_LEN 1976ред рдареНрдпрд╛рдХреНрдХреИ рдХрд┐рди рдпреЛ? рдХрд┐рдирднрдиреЗ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЧреБрдирд╛рд╕реЛ рдЧрд░реНрдЫ! рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реБрдЭрд╛рд╡ рджрд┐рдПрдХрд╛ рдЫрдиреН рдХрд┐ рдорд▓рд╛рдИ рд╕реНрдЯреНрдпрд╛рдХ рд░ рд╣рд┐рдк рдмреБрдЭреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдХреБрдиреИ рджрд┐рди рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдпреЛ рдЧрд░реНрдиреЗрдЫреБ рд░ рд╕рд╛рдпрдж рдХреЛрдб рдкрдирд┐ рд╕рдЪреНрдпрд╛рдЙрдиреЗрдЫреБред рдореИрд▓реЗ рддреБрд░реБрдиреНрддреИ рд▓рд╛рдЗрди рд╕реЗрдЯ рдЧрд░реЗрдВ рдЬреБрди рдЖрджреЗрд╢ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрдиреЗрдЫ: char cmd_string[MAX_CMD_LEN];ред рдпреЛ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рджреЗрдЦрд┐рдиреЗ рд╣реБрдиреБрдкрд░реНрдЫ; рдо рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЕрдиреБрдЪреНрдЫреЗрдж 9 рдорд╛ рдердк рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред
  3. рдЕрдм рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (struct work_struct my_work;) рд╕рдВрд░рдЪрдирд╛ рд░ рдпрд╕рд▓рд╛рдИ рдЕрд░реНрдХреЛ рдкреНрд░рдХрд╛рд░реНрдпрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реН (DECLARE_WORK(my_work, work_handler);)ред рдо рдирд╡реМрдВ рдЕрдиреБрдЪреНрдЫреЗрджрдорд╛ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рдкрдирд┐ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред
  4. рдЕрдм рдо рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рдШреЛрд╖рдгрд╛ рдЧрд░реНрдЫреБ, рдЬреБрди рд╣реБрдХ рд╣реБрдиреЗрдЫред рдкреНрд░рдХрд╛рд░ рд░ рд╕реНрд╡реАрдХреГрдд рддрд░реНрдХрд╣рд░реВ рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реБрдиреНрдЫрдиреН, рд╣рд╛рдореА рдорд╛рддреНрд░ рдЗрдЪреНрдЫреБрдХ рдЫреМрдВ skbред рдпреЛ рд╕рдХреЗрдЯ рдмрдлрд░ рд╣реЛ, рдПрдХ рдЖрдзрд╛рд░рднреВрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЬрд╕рд▓реЗ рдкреНрдпрд╛рдХреЗрдЯрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕рдмреИ рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред
  5. рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓рд╛рдИ рджреБрдИ рдврд╛рдБрдЪрд╛рд╣рд░реВ рд░ рджреБрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рд╕рд╣рд┐рдд рдзреЗрд░реИ рдЪрд░рд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред
      struct iphdr *iph;
      struct icmphdr *icmph;
    
      unsigned char *user_data;
      unsigned char *tail;
      unsigned char *i;
      int j = 0;
  6. рд╣рд╛рдореА рддрд░реНрдХ рд╕рдВрдЧ рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рдореЛрдбреНрдпреБрд▓рд▓реЗ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, 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 рдХреЛ рдореЗрд░реЛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рдирд▓реЗ рдорд▓рд╛рдИ рдмрддрд╛рдЙрдБрдЫ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдБрдЪ рдмрд┐рдирд╛, рдХреЗрд╣рд┐ рднрдпрд╛рдирдХ рд╣реБрди рдмрд╛рдзреНрдп рдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдорд▓рд╛рдИ рдпрд╕рдмрд╛рдЯ рд░реЛрдХреНрдиреБ рднрдпреЛ рднрдиреЗ рдо рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБ!

  7. рдЕрдм рдЬрдм рдкреНрдпрд╛рдХреЗрдЬ рддрдкрд╛рдИрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рд╕рд╣реА рдкреНрд░рдХрд╛рд░рдХреЛ рдЫ, рддрдкрд╛рдИрд▓реЗ рдбрд╛рдЯрд╛ рдирд┐рдХрд╛рд▓реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░реНрдп рдмрд┐рдирд╛, рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдкреЗрд▓реЛрдбрдХреЛ рд╕реБрд░реБрдорд╛ рдПрдХ рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБ рдкрд░реНрдЫред рдпреЛ рдПрдХреИ рдард╛рдЙрдБрдорд╛ рдЧрд░рд┐рдиреНрдЫ, рддрдкрд╛рдИрдВрд▓реЗ рд╕реВрдЪрдХрд▓рд╛рдИ ICMP рд╣реЗрдбрд░рдХреЛ рд╕реБрд░реБрдорд╛ рд▓реИрдЬрд╛рдиреБрдкрд░реНрдЫ рд░ рдпрд╕рд▓рд╛рдИ рдпреЛ рд╣реЗрдбрд░рдХреЛ рд╕рд╛рдЗрдЬрдорд╛ рд▓реИрдЬрд╛рдиреБрдкрд░реНрдЫред рд╕рдмреИ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ icmph: user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
    рд╣реЗрдбрд░рдХреЛ рдЕрдиреНрддреНрдпрдорд╛ рдкреЗрд▓реЛрдбрдХреЛ рдЕрдиреНрддреНрдпрд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреБрдкрд░реНрдЫ skb, рдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдВрд░рдЪрдирд╛рдмрд╛рдЯ рдЖрдгрд╡рд┐рдХ рдорд╛рдзреНрдпрдорд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВ: tail = skb_tail_pointer(skb);.

    ICMP рдорд╛ рдЖрдгрд╡рд┐рдХ рдЦреЛрд▓

    рддрд╕реНрд╡реАрд░ рдЪреЛрд░реА рднрдпреЛ рдпрд╣рд╛рдБ рджреЗрдЦрд┐, рддрдкрд╛рдЗрдБ рд╕рдХреЗрдЯ рдмрдлрд░ рдмрд╛рд░реЗ рдердк рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

  8. рдПрдХрдЪреЛрдЯрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рд╕реБрд░реБ рд░ рдЕрдиреНрддреНрдпрдорд╛ рд╕рдВрдХреЗрддрд╣рд░реВ рднрдПрдкрдЫрд┐, рддрдкрд╛рдЗрдБ рдбреЗрдЯрд╛рд▓рд╛рдИ рд╕реНрдЯреНрд░рд┐рдЩрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ cmd_string, рдЙрдкрд╕рд░реНрдЧрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН run: рд░, рдпрджрд┐ рд╣рд░рд╛рдЗрд░рд╣реЗрдХреЛ рдЫ рднрдиреЗ рдкреНрдпрд╛рдХреЗрдЬ рдЦрд╛рд░реЗрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд╡рд╛ рдпреЛ рдЙрдкрд╕рд░реНрдЧ рд╣рдЯрд╛рдПрд░ рд▓рд╛рдЗрдирд▓рд╛рдИ рдлреЗрд░рд┐ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реНред
  9. рдпреЛ рд╣реЛ, рдЕрдм рддрдкрд╛рдЗрдБ рдЕрд░реНрдХреЛ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: schedule_work(&my_work);ред рдпрд╕реНрддреЛ рдХрд▓рдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкрд╛рд╕ рдЧрд░реНрди рд╕рдореНрднрд╡ рдирд╣реБрдиреЗ рднрдПрдХреЛрд▓реЗ, рдХрдорд╛рдгреНрдбрдХреЛ рд╕рд╛рде рд▓рд╛рдЗрди рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рд╣реБрдиреБрдкрд░реНрдЫред schedule_work() рдкрд╛рд╕ рдЧрд░рд┐рдПрдХреЛ рд╕рдВрд░рдЪрдирд╛рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХрд╛рд░реНрдпрд▓рд╛рдИ рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреБрд▓рд░рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд▓рд╛рдордорд╛ рд░рд╛рдЦреНрдиреЗрдЫ рд░ рдкреВрд░рд╛ рд╣реБрдиреЗрдЫ, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрджреЗрд╢ рдкреВрд░рд╛ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрди рдирджрд┐рдиреЗ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐рдирднрдиреЗ рд╣реБрдХ рдзреЗрд░реИ рдЫрд┐рдЯреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдЕрдиреНрдпрдерд╛, рддрдкрд╛рдЗрдБрдХреЛ рдЫрдиреЛрдЯ рдпреЛ рд╣реЛ рдХрд┐ рдХреЗрд╣рд┐ рдкрдирд┐ рд╕реБрд░реБ рд╣реБрдиреЗрдЫреИрди рд╡рд╛ рддрдкрд╛рдЗрдБ рдПрдХ рдХрд░реНрдиреЗрд▓ рдЖрддрдВрдХ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред рдврд┐рд▓рд╛рдЗ рдореГрддреНрдпреБ рдЬрд╕реНрддреИ рд╣реЛ!
  10. рдпреЛ рд╣реЛ, рддрдкрд╛рдЗрдБ рд╕рдорд╛рди рд░рд┐рдЯрд░реНрди рд╕рдВрдЧ рдкреНрдпрд╛рдХреЗрдЬ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╕реНрдкреЗрд╕рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд▓ рдЧрд░реНрджреИ

рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп рд╕рдмреИрднрдиреНрджрд╛ рдмреБрдЭреНрди рдпреЛрдЧреНрдп рдЫред рдпрд╕рдХреЛ рдирд╛рдо рдорд╛ рджрд┐рдЗрдПрдХреЛ рдерд┐рдпреЛ 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);
}

  1. рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрдХреЛ рдПрд░реНрд░реЗрдорд╛ рддрд░реНрдХрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН argv[]ред рдо рдорд╛рдиреНрдиреЗрдЫреБ рдХрд┐ рд╕рдмреИрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдпрд╕рд░реА рдЪрд▓реНрдЫрдиреН, рд░ рдЦрд╛рд▓реА рдард╛рдЙрдБрд╣рд░реВрд╕рдБрдЧ рдирд┐рд░рдиреНрддрд░ рд░реЗрдЦрд╛рдХреЛ рд░реВрдкрдорд╛ рд╣реЛрдЗрдиред
  2. рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдореИрд▓реЗ рдХреЗрд╡рд▓ рдкрдерд╣рд░реВрдХреЛ рдиреНрдпреВрдирддрдо рд╕реЗрдЯрдХреЛ рд╕рд╛рде PATH рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реЗрдВ, рдЖрд╢рд╛ рдЫ рдХрд┐ рддреА рд╕рдмреИ рдкрд╣рд┐рд▓реЗ рдиреИ рдЬреЛрдбрд┐рдПрдХрд╛ рдерд┐рдПред /bin ╤Б /usr/bin ╨╕ /sbin ╤Б /usr/sbinред рдЕрдиреНрдп рдорд╛рд░реНрдЧрд╣рд░реВ рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рд╡рд┐рд░рд▓реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╣реБрдиреНрдЫрдиреНред
  3. рд╕рдХрд┐рдпреЛ, рдЧрд░реМрдВ! рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХрд╛рд░реНрдп 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 рдорд╛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдЧрд░реНрди рд╕рд╣рдордд рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдо рдЖрднрд╛рд░реА рд╣реБрдиреЗрдЫреБред рдо рдкрдХреНрдХрд╛ рдЫреБ рдХрд┐ рдореИрд▓реЗ рдзреЗрд░реИ рдмреЗрд╡рдХреВрдл рдЧрд▓реНрддреАрд╣рд░реВ рдЧрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдЬрдм рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИред

ICMP рдорд╛ рдЖрдгрд╡рд┐рдХ рдЦреЛрд▓

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди