ICMP เชชเชฐ เชชเชฐเชฎเชพเชฃเซ เชถเซ‡เชฒ

ICMP เชชเชฐ เชชเชฐเชฎเชพเชฃเซ เชถเซ‡เชฒ

TL; DR: เชนเซเช‚ เช•เชฐเซเชจเชฒ เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเช–เซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เชœเซ‡ ICMP เชชเซ‡เชฒเซ‹เชกเชฎเชพเช‚เชฅเซ€ เช†เชฆเซ‡เชถเซ‹ เชตเชพเช‚เชšเชถเซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‹ SSH เช•เซเชฐเซ‡เชถ เชฅเชพเชฏ เชคเซ‹ เชชเชฃ เชคเซ‡เชจเซ‡ เชธเชฐเซเชตเชฐ เชชเชฐ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชถเซ‡. เชธเซŒเชฅเซ€ เช…เชงเซ€เชฐเชพ เชฎเชพเชŸเซ‡, เชฌเชงเชพ เช•เซ‹เชก เช›เซ‡ GitHub.

เชธเชพเชตเชงเชพเชจ! เช…เชจเซเชญเชตเซ€ เชธเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซ‹ เชฒเซ‹เชนเซ€เชจเชพ เช†เช‚เชธเซเชฎเชพเช‚ เชซเซ‚เชŸเชตเชพเชจเซเช‚ เชœเซ‹เช–เชฎ เชฒเซ‡ เช›เซ‡! เชชเชฐเชฟเชญเชพเชทเชพเชฎเชพเช‚ เชนเซเช‚ เช–เซ‹เชŸเซ‹ เชชเชฃ เชนเซ‹เชˆ เชถเช•เซเช‚, เชชเชฐเช‚เชคเซ เช•เซ‹เชˆเชชเชฃ เชŸเซ€เช•เชพ เช†เชตเช•เชพเชฐเซเชฏ เช›เซ‡. เช† เชชเซ‹เชธเซเชŸ เชเชตเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชฌเชจเชพเชตเชพเชฏเซ‡เชฒ เช›เซ‡ เชœเซ‡เชฎเชจเซ‡ C เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—เชจเซ‹ เช–เซ‚เชฌ เชœ เชฐเชซ เช†เชˆเชกเชฟเชฏเชพ เช›เซ‡ เช…เชจเซ‡ เชœเซ‡เช“ Linux เชจเซ€ เช…เช‚เชฆเชฐเชจเซ€ เชคเชฐเชซ เชœเซ‹เชตเชพ เชฎเชพเช—เซ‡ เช›เซ‡.

เชฎเชพเชฐเซ€ เชชเซเชฐเชฅเชฎ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชฒเซ‡เช– SoftEther VPN เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡, เชœเซ‡ เช…เชฎเซเช• "เชจเชฟเชฏเชฎเชฟเชค" เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ€ เชจเช•เชฒ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ HTTPS, ICMP เช…เชจเซ‡ DNS. เชนเซเช‚ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ€ เชถเช•เซเช‚ เช›เซเช‚ เช•เซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฎเชพเชคเซเชฐ เชชเซเชฐเชฅเชฎ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชนเซเช‚ HTTP(S) เชฅเซ€ เช–เซ‚เชฌ เชœ เชชเชฐเชฟเชšเชฟเชค เช›เซเช‚, เช…เชจเซ‡ เชฎเชพเชฐเซ‡ ICMP เช…เชจเซ‡ DNS เชชเชฐ เชŸเชจเชฒเชฟเช‚เช— เชถเซ€เช–เชตเซเช‚ เชชเชกเซเชฏเซเช‚ เชนเชคเซเช‚.

ICMP เชชเชฐ เชชเชฐเชฎเชพเชฃเซ เชถเซ‡เชฒ

เชนเชพ, 2020 เชฎเชพเช‚ เชฎเซ‡เช‚ เชถเซ€เช–เซเชฏเชพ เช•เซ‡ เชคเชฎเซ‡ ICMP เชชเซ‡เช•เซ‡เชŸเซเชธเชฎเชพเช‚ เชฎเชจเชธเซเชตเซ€ เชชเซ‡เชฒเซ‹เชก เชฆเชพเช–เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชชเชฐเช‚เชคเซ เช•เซเชฏเชพเชฐเซ‡เชฏ เช•เชฐเชคเชพเช‚ เชฎเซ‹เชกเซเช‚ เชธเชพเชฐเซเช‚! เช…เชจเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เช•เช‚เชˆเช• เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชคเซ‹ เชคเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฎเชพเชฐเชพ เชฐเซ‹เชœเชฟเช‚เชฆเชพ เชœเซ€เชตเชจเชฎเชพเช‚ เชนเซเช‚ เชฎเซ‹เชŸเชพเชญเชพเช—เซ‡ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚, เชœเซ‡เชฎเชพเช‚ SSH เชฆเซเชตเชพเชฐเชพ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, ICMP เชถเซ‡เชฒเชจเซ‹ เชตเชฟเชšเชพเชฐ เชชเซเชฐเชฅเชฎ เชฎเชพเชฐเชพ เชฎเช—เชœเชฎเชพเช‚ เช†เชตเซเชฏเซ‹. เช…เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเซเชฒเชถเชฟเชฒเซเชก เชฌเชฟเชจเซเช—เซ‹ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ เชคเซ‡เชจเซ‡ เชเช• เชเชตเซ€ เชญเชพเชทเชพเชฎเชพเช‚ เชฒเชฟเชจเช•เซเชธ เชฎเซ‹เชกเซเชฏเซเชฒ เชคเชฐเซ€เช•เซ‡ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช•เซ‡ เชœเซ‡เชจเซ‹ เชฎเชจเซ‡ เชฎเชพเชคเซเชฐ เช…เช‚เชฆเชพเชœ เช›เซ‡. เช†เชตเชพ เชถเซ‡เชฒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชจเซ€ เชธเซ‚เชšเชฟเชฎเชพเช‚ เชฆเซ‡เช–เชพเชถเซ‡ เชจเชนเซ€เช‚, เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡ เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชจเชนเซ€เช‚ เชนเซ‹เชฏ, เชธเชพเช‚เชญเชณเชตเชพเชจเชพ เชชเซ‹เชฐเซเชŸเซเชธเชจเซ€ เชธเซ‚เชšเชฟเชฎเชพเช‚ เชคเชฎเชจเซ‡ เชถเช‚เช•เชพเชธเซเชชเชฆ เช•เช‚เชˆเชชเชฃ เชฆเซ‡เช–เชพเชถเซ‡ เชจเชนเซ€เช‚. เชคเซ‡เชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚, เช† เชเช• เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชตเชฟเชงเชพเชฏเซเช•เซเชค เชฐเซเชŸเช•เชฟเชŸ เช›เซ‡, เชชเชฐเช‚เชคเซ เชนเซเช‚ เชคเซ‡เชจเซ‡ เชธเซเชงเชพเชฐเชตเชพเชจเซ€ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚ เช…เชจเซ‡ SSH เชฆเซเชตเชพเชฐเชพ เชฒเซ‹เช— เช‡เชจ เช•เชฐเชตเชพ เช…เชจเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเซ‹เชก เชเชตเชฐเซ‡เชœ เช–เซ‚เชฌ เชตเชงเชพเชฐเซ‡ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เช›เซ‡เชฒเซเชฒเชพ เช‰เชชเชพเชฏเชจเชพ เชถเซ‡เชฒ เชคเชฐเซ€เช•เซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช†เชถเชพ เชฐเชพเช–เซเช‚ เช›เซเช‚. echo i > /proc/sysrq-triggerเชฐเซ€เชฌเซ‚เชŸ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชเช•เซเชธเซ‡เชธ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡.

เช…เชฎเซ‡ เชเช• เชŸเซ‡เช•เซเชธเซเชŸ เชเชกเชฟเชŸเชฐ เชฒเชˆเช เช›เซ€เช, Python เช…เชจเซ‡ C, 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;
      }

    IP เชนเซ‡เชกเชฐเซ‹เชจเซ‡ เชคเชชเชพเชธเซเชฏเชพ เชตเชฟเชจเชพ เชถเซเช‚ เชฅเชถเซ‡ เชคเซ‡ เชฎเซ‡เช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซเชฏเซเช‚ เชจเชฅเซ€. เชธเซ€ เชตเชฟเชถเซ‡เชจเซเช‚ เชฎเชพเชฐเซเช‚ เชจเซเชฏเซ‚เชจเชคเชฎ เชœเซเชžเชพเชจ เชฎเชจเซ‡ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เชคเชชเชพเชธ เชตเชฟเชจเชพ, เช•เช‚เชˆเช• เชญเชฏเช‚เช•เชฐ เชฌเชจเชตเชพเชจเซเช‚ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เชฎเชจเซ‡ เช†เชจเชพเชฅเซ€ เชจเชพ เชชเชพเชกเชถเซ‹ เชคเซ‹ เชฎเชจเซ‡ เช†เชจเช‚เชฆ เชฅเชถเซ‡!

  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 เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชคเชพเชฐเซ€เช–เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ เชฎเซ‡เช‚ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช•เชฐเซเชฏเซเช‚.

เชจเชฟเชทเซเช•เชฐเซเชท

เชชเชฐเชฎเชพเชฃเซ เชตเชฟเช•เชพเชธ เชธเชพเชฅเซ‡เชจเซ‹ เชฎเชพเชฐเซ‹ เชชเซเชฐเชฅเชฎ เช…เชจเซเชญเชต เชฎเชพเชฐเซ€ เช…เชชเซ‡เช•เซเชทเชพ เช•เชฐเชคเชพเช‚ เช˜เชฃเซ‹ เชธเชฐเชณ เชนเชคเซ‹. เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชธเช‚เช•เซ‡เชคเซ‹ เช…เชจเซ‡ Google เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ€เชจเซ‡, C เชฎเชพเช‚ เชตเชฟเช•เชพเชธ เช•เชฐเซเชฏเชพเชจเชพ เช…เชจเซเชญเชต เชตเชฟเชจเชพ เชชเชฃ, เชนเซเช‚ เชเช• เชตเชฐเซเช•เชฟเช‚เช— เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเช–เซ€ เชถเช•เซเชฏเซ‹ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชนเซ‡เช•เชฐ เชœเซ‡เชตเซ‹ เช…เชจเซเชญเชต เช•เชฐเซ€ เชถเช•เซเชฏเซ‹, เช…เชจเซ‡ เชคเซ‡ เชœ เชธเชฎเชฏเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฟเชกเซ€. เชตเชงเซเชฎเชพเช‚, เชนเซเช‚ เช•เชฐเซเชจเชฒ เชจเซเชฏเซ‚เชฌเซ€เช เชšเซ‡เชจเชฒ เชชเชฐ เช—เชฏเซ‹, เชœเซเชฏเชพเช‚ เชฎเชจเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ schedule_work() เช•เซ‰เชฒ เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ call_usermodehelper() เชนเซ‚เช•เชจเซ€ เช…เช‚เชฆเชฐ เชœ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชถเชฐเชฎเชœเชจเช•, เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เซŒเชญเชพเช‚เชกเชจเซ€ เชถเช‚เช•เชพ. เช•เซ‹เชกเชจเซ€ เชธเซ‹ เชฒเซ€เชŸเซ€เช“ เชฎเชพเชฐเชพ เชซเซเชฐเซ€ เชŸเชพเช‡เชฎเชฎเชพเช‚ เชตเชฟเช•เชพเชธเชจเชพ เชเช• เช…เช เชตเชพเชกเชฟเชฏเชพ เชตเชฟเชถเซ‡ เช–เชฐเซเชš เช•เชฐเซ‡ เช›เซ‡. เชเช• เชธเชซเชณ เช…เชจเซเชญเชต เชœเซ‡เชฃเซ‡ เชธเชฟเชธเซเชŸเชฎเชจเชพ เชตเชฟเช•เชพเชธเชจเซ€ เชœเชฌเชฐเชœเชธเซเชค เชœเชŸเชฟเชฒเชคเชพ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชฐเซ€ เช…เช‚เช—เชค เชฎเชพเชจเซเชฏเชคเชพเชจเซ‹ เชจเชพเชถ เช•เชฐเซเชฏเซ‹.

เชœเซ‹ เช•เซ‹เชˆ เช—เซ€เชฅเชฌ เชชเชฐ เช•เซ‹เชก เชธเชฎเซ€เช•เซเชทเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชฎเชค เชฅเชพเชฏ, เชคเซ‹ เชนเซเช‚ เช†เชญเชพเชฐเซ€ เชฐเชนเซ€เชถ. เชฎเชจเซ‡ เช–เชพเชคเชฐเซ€ เช›เซ‡ เช•เซ‡ เชฎเซ‡เช‚ เช˜เชฃเซ€ เชฎเซ‚เชฐเซเช– เชญเซ‚เชฒเซ‹ เช•เชฐเซ€ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชถเชฌเซเชฆเชฎเชพเชณเชพเช“ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡.

ICMP เชชเชฐ เชชเชฐเชฎเชพเชฃเซ เชถเซ‡เชฒ

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹