рдЖрдИрд╕реАрдПрдордкреА рдХреЗ рдКрдкрд░ рдкрд░рдорд╛рдгреБ рдЧреЛрд▓рд╛

рдЖрдИрд╕реАрдПрдордкреА рдХреЗ рдКрдкрд░ рдкрд░рдорд╛рдгреБ рдЧреЛрд▓рд╛

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

рдЪреЗрддрд╛рд╡рдиреА! рдЕрдиреБрднрд╡реА рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЦреВрди рдХреЗ рдЖрдВрд╕реВ рдмрд╣рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛рддреЗ рд╣реИрдВ! рдореИрдВ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЧрд▓рдд рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдпрд╣ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдмрд╣реБрдд рдореЛрдЯрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдФрд░ рд╡реЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓реЗрдЦ рд╕реЙрдлреНрдЯрдИрдерд░ рд╡реАрдкреАрдПрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ "рдирд┐рдпрдорд┐рдд" рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ HTTPS, ICMP рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ DNS рдореЗрдВ рднреАред рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ HTTP(S) рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ ICMP рдФрд░ DNS рдкрд░ рдЯрдирд▓рд┐рдВрдЧ рд╕реАрдЦрдиреА рдкрдбрд╝реАред

рдЖрдИрд╕реАрдПрдордкреА рдХреЗ рдКрдкрд░ рдкрд░рдорд╛рдгреБ рдЧреЛрд▓рд╛

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

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

рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрднрдЧ 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:, рд╣рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреЗрд▓реЛрдб рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреИрдХреЗрдЬ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реБрдкрд░рдпреВрдЬрд╝рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрдорддрд┐рдпрд╛рдБ рджреЗрдирд╛ рдФрд░ рд╕реНрдХреИрдкреА рдХреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдбреЗрдмрд┐рдпрди рдирд╛рдордХ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ 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. рдЗрд╕ рдмрд╛рд░ рдЖрдИрдкреА рдФрд░ рдЖрдИрд╕реАрдПрдордкреА рд╣реЗрдбрд░ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреА рдкрдбрд╝реАрдВред
  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;
      }

    рдореИрдВрдиреЗ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдИрдкреА рд╣реЗрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдиреНрдпреВрдирддрдо рдЬреНрдЮрд╛рди рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднрдпрд╛рдирдХ рдШрдЯрд┐рдд рд╣реЛрдирд╛ рддрдп рд╣реИред рдпрджрд┐ рдЖрдк рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдордирд╛ рдХрд░реЗрдВрдЧреЗ рддреЛ рдореБрдЭреЗ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА!

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

    рдЖрдИрд╕реАрдПрдордкреА рдХреЗ рдКрдкрд░ рдкрд░рдорд╛рдгреБ рдЧреЛрд▓рд╛

    рддрд╕реНрд╡реАрд░ рдЪреЛрд░реА рд╣реЛ рдЧрдИ рдереА рдЕрдд:, рдЖрдк рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

  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 рдФрд░ рдХреНрд▓реАрди рд▓рдХреНрд╖реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореЗрдВ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ