ICMP рд╡рд░ рдЖрдгреНрд╡рд┐рдХ рдХрд╡рдЪ

ICMP рд╡рд░ рдЖрдгреНрд╡рд┐рдХ рдХрд╡рдЪ

TL; рдбреЙ: рдореА рдПрдХ рдХрд░реНрдирд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ рдЬреЗ ICMP рдкреЗрд▓реЛрдб рд╡рд░реВрди рдХрдорд╛рдВрдб рд╡рд╛рдЪреЗрд▓ рдЖрдгрд┐ рддреБрдордЪрд╛ SSH рдХреНрд░реЕрд╢ рдЭрд╛рд▓рд╛ рддрд░реАрд╣реА рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрд▓. рд╕рд░реНрд╡рд╛рдд рдЕрдзреАрд░ рд╕рд╛рдареА, рд╕рд░реНрд╡ рдХреЛрдб рдЖрд╣реЗ github.

рдЦрдмрд░рджрд╛рд░реА рдЕрдиреБрднрд╡реА рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдирд╛ рд░рдХреНрддрд╛рдЪреЗ рдЕрд╢реНрд░реВ рдлреБрдЯрдгреНрдпрд╛рдЪрд╛ рдзреЛрдХрд╛! рдореА рд╢рдмреНрджрд╢рдГ рдЪреБрдХреАрдЪреЗ рдЕрд╕реВ рд╢рдХрддреЗ, рдкрдг рдХреЛрдгрддреНрдпрд╛рд╣реА рдЯреАрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ. рдкреЛрд╕реНрдЯ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдЖрд╣реЗ рдЬреНрдпрд╛рдВрдирд╛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧрдЪреА рдЦреВрдк рдвреЛрдмрд│ рдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдЬреНрдпрд╛рдВрдирд╛ рд▓рд┐рдирдХреНрд╕рдЪреНрдпрд╛ рдЕрдВрддрд░реНрднрд╛рдЧрд╛рдд рд▓рдХреНрд╖ рдШрд╛рд▓рд╛рдпрдЪреЗ рдЖрд╣реЗ.

рдорд╛рдЭреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд▓реЗрдЦ рд╕реЙрдлреНрдЯрдЗрдерд░ рд╡реНрд╣реАрдкреАрдПрдирдЪрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреЗрд▓рд╛ рдЖрд╣реЗ, рдЬреЛ рдХрд╛рд╣реА "рдирд┐рдпрдорд┐рдд" рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЪреА рдирдХреНрдХрд▓ рдХрд░реВ рд╢рдХрддреЛ, рд╡рд┐рд╢реЗрд╖рдд: HTTPS, ICMP рдЖрдгрд┐ рдЕрдЧрджреА DNS. рдореА рдХрд▓реНрдкрдирд╛ рдХрд░реВ рд╢рдХрддреЛ рдХреА рддреНрдпрд╛рдкреИрдХреА рдкрд╣рд┐рд▓реЗ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЗрдд, рдХрд╛рд░рдг рдореА HTTP(S) рд╢реА рдЦреВрдк рдкрд░рд┐рдЪрд┐рдд рдЖрд╣реЗ, рдЖрдгрд┐ рдорд▓рд╛ ICMP рдЖрдгрд┐ DNS рд╡рд░ рдЯрдиреЗрд▓рд┐рдВрдЧ рд╢рд┐рдХрд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ.

ICMP рд╡рд░ рдЖрдгреНрд╡рд┐рдХ рдХрд╡рдЪ

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

рдЖрдореНрд╣реА рдордЬрдХреВрд░ рд╕рдВрдкрд╛рджрдХ рдШреЗрддреЛ, рдкрд╛рдпрдерди рдЖрдгрд┐ рд╕реА, Google рдЖрдгрд┐ рдордзреАрд▓ рдореВрд▓рднреВрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреМрд╢рд▓реНрдпреЗ рдЖрднрд╛рд╕реА рд╕рд░реНрд╡ рдХрд╛рд╣реА рддреБрдЯрд▓реНрдпрд╛рд╕ рдЪрд╛рдХреВрдЦрд╛рд▓реА рдареЗрд╡рдгреНрдпрд╛рд╕ рддреБрдордЪреА рд╣рд░рдХрдд рдирд╛рд╣реА (рдкрд░реНрдпрд╛рдпреА - рд╕реНрдерд╛рдирд┐рдХ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓рдмреЙрдХреНрд╕/рдХреЗрд╡реНрд╣реАрдПрдо/рдЗ.) рдЖрдгрд┐ рдЪрд▓рд╛ рдЬрд╛рдКрдпрд╛!

рдХреНрд▓рд╛рдпрдВрдЯрдЪреА рдмрд╛рдЬреВ

рдорд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдХреА рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рднрд╛рдЧрд╛рд╕рд╛рдареА рдорд▓рд╛ рд╕реБрдорд╛рд░реЗ 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, рдЙрд░реНрд╡рд░рд┐рдд рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡рд╛рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдпреЗрдИрд▓. рдореА рд▓реЗрдЦрд╛рдд рд╕рдВрдкреВрд░реНрдг рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА; рддреБрдореНрд╣реА рддреЗ рдЧрд┐рдердмрд╡рд░ рдХреНрд▓реЛрди рдХрд░реВ рд╢рдХрддрд╛.

рд╣реБрдХ рд╕реЗрдЯрдЕрдк

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреЗ рдЕрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЛрди рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдЕрдирд▓реЛрдбрд┐рдВрдЧрд╕рд╛рдареА рдлрдВрдХреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдирдВрддрд░ 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;
      }

    рдЖрдпрдкреА рд╣реЗрдбрд░ рддрдкрд╛рд╕рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдХрд╛рдп рд╣реЛрдИрд▓ рдпрд╛рдЪреА рдореА рдЪрд╛рдЪрдгреА рдХреЗрд▓реА рдирд╛рд╣реА. рдорд╛рдЭреЗ 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 рдЖрдгрд┐ рддреНрдпрд╛рдд рд╡рд┐рдирдВрддреА рдкрд╛рдард╡рд▓реНрдпрд╛рдЪреА рддрд╛рд░реАрдЦ рдЖрд╣реЗ, рдпрд╛рдЪрд╛ рдЕрд░реНрде рддреБрдореНрд╣реА рд╕рд░реНрд╡рдХрд╛рд╣реА рдмрд░реЛрдмрд░ рдХреЗрд▓реЗ рдЖрдгрд┐ рдореА рд╕рд░реНрд╡рдХрд╛рд╣реА рдмрд░реЛрдмрд░ рдХреЗрд▓реЗ.

рдирд┐рд╖реНрдХрд░реНрд╖

рдЖрдгреНрд╡рд┐рдХ рд╡рд┐рдХрд╛рд╕рд╛рдЪрд╛ рдорд╛рдЭрд╛ рдкрд╣рд┐рд▓рд╛ рдЕрдиреБрднрд╡ рдорд╛рдЭреНрдпрд╛ рдЕрдкреЗрдХреНрд╖реЗрдкреЗрдХреНрд╖рд╛ рдЦреВрдкрдЪ рд╕реЛрдкрд╛ рд╣реЛрддрд╛. C рдордзреНтАНрдпреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдгреНтАНрдпрд╛рдЪрд╛ рдЕрдиреБрднрд╡ рдирд╕рддрд╛рдирд╛рд╣реА, рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╢рд╛рд░реЗ рдЖрдгрд┐ Google рдкрд░рд┐рдгрд╛рдорд╛рдВрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрди, рдореА рдПрдХ рдХрд╛рд░реНрдпрд░рдд рдореЙрдбреНрдпреВрд▓ рд▓рд┐рд╣реВ рд╢рдХрд▓реЛ рдЖрдгрд┐ рдХрд░реНрдирд▓ рд╣реЕрдХрд░ рдЖрдгрд┐ рддреНрдпрд╛рдЪ рд╡реЗрд│реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдбреА рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЯреВ рд╢рдХрд▓реЛ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдореА рдХрд░реНрдирд▓ рдиреНрдпреВрдмреАрдЬ рдЪреЕрдиреЗрд▓рд╡рд░ рдЧреЗрд▓реЛ, рдЬрд┐рдереЗ рдорд▓рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рд╣реЛрддреЗ schedule_work() рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА call_usermodehelper() рд╣реБрдХ рдЖрдд рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рд▓рд╛рдЬ рд╡рд╛рдЯрд▓реА, рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдПрдХ рдШреЛрдЯрд╛рд│рд╛ рд╕рдВрд╢рдп. рдХреЛрдбрдЪреНрдпрд╛ рд╢рдВрднрд░ рдУрд│реАрдВрдЪрд╛ рдорд╛рдЭреНрдпрд╛ рдореЛрдХрд│реНрдпрд╛ рд╡реЗрд│реЗрдд рд╡рд┐рдХрд╛рд╕рд╛рдЪрд╛ рдПрдХ рдЖрдард╡рдбрд╛ рдЦрд░реНрдЪ рд╣реЛрддреЛ. рдПрдХ рдпрд╢рд╕реНрд╡реА рдЕрдиреБрднрд╡ рдЬреНрдпрд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЬрдмрд░рджрд╕реНрдд рдЬрдЯрд┐рд▓рддреЗрдмрджреНрджрд▓ рдорд╛рдЭреА рд╡реИрдпрдХреНрддрд┐рдХ рд╕рдордЬ рдирд╖реНрдЯ рдХреЗрд▓реА.

рдЬрд░ рдХреЛрдгреА Github рд╡рд░ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╣рдордд рдЕрд╕реЗрд▓ рддрд░ рдореА рдЖрднрд╛рд░реА рдЖрд╣реЗ. рдорд▓рд╛ рдЦрд╛рддреНрд░реА рдЖрд╣реЗ рдХреА рдореА рдмрд░реНтАНрдпрд╛рдЪ рдореВрд░реНрдЦ рдЪреБрдХрд╛ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рд╡рд┐рд╢реЗрд╖рдд: рд╕реНрдЯреНрд░рд┐рдВрдЧрд╕рд╣ рдХрд╛рдо рдХрд░рддрд╛рдирд╛.

ICMP рд╡рд░ рдЖрдгреНрд╡рд┐рдХ рдХрд╡рдЪ

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛