ื™ืึธื“ืขืจ ืฉืึธืœ ืื™ื‘ืขืจ ICMP

ื™ืึธื“ืขืจ ืฉืึธืœ ืื™ื‘ืขืจ ICMP

ื˜ืœ; ื“ืจ: ืื™ืš ืฉืจื™ื™ื‘ ืึท ืงืขืจืŸ ืžืึธื“ื•ืœืข ื•ื•ืึธืก ื•ื•ืขื˜ ืœื™ื™ืขื ืขืŸ ืงืึทืžืึทื ื“ื– ืคื•ืŸ ื“ื™ ICMP ืคึผื™ื™ืœืึธื•ื“ ืื•ืŸ ื•ื™ืกืคื™ืจืŸ ื–ื™ื™ ืื•ื™ืฃ ื“ื™ ืกืขืจื•ื•ืขืจ ืืคื™ืœื• ืื•ื™ื‘ ื“ื™ื™ืŸ SSH ืงืจืึทืฉื™ื–. ืคึฟืึทืจ ื“ื™ ืžืขืจืกื˜ ื•ืžื’ืขื“ื•ืœื“ื™ืง, ืึทืœืข ื“ื™ ืงืึธื“ ืื™ื– ื’ื™ื˜ื”ื•ื‘.

ื•ื•ืึธืจืขื ืขืŸ ื™ืงืกืคึผื™ืจื™ืึทื ืกื˜ C ืคึผืจืึธื•ื’ืจืึทืžืขืจื– ืจื™ื–ื™ืงื™ืจืŸ ื‘ืขืจืกื˜ื™ื ื’ ืื™ืŸ ื˜ืจืขืจืŸ ืคื•ืŸ ื‘ืœื•ื˜! ืื™ืš ืงืขืŸ ืืคื™ืœื• ื–ื™ื™ืŸ ืคืึทืœืฉ ืื™ืŸ ื“ื™ ื˜ืขืจืžื™ื ืึธืœืึธื’ื™ืข, ืึธื‘ืขืจ ืงื™ื™ืŸ ืงืจื™ื˜ื™ืง ืื™ื– ื‘ืึทื’ืจื™ืกืŸ. ื“ืขืจ ืคึผืึธืกื˜ืŸ ืื™ื– ื‘ื“ืขื” ืคึฟืึทืจ ื™ืขื ืข ื•ื•ืึธืก ื”ืึธื‘ืŸ ืึท ื–ื™ื™ืขืจ ืคึผืจืึธืกื˜ ื’ืขื“ืึทื ืง ืคื•ืŸ C ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืื•ืŸ ื•ื•ื™ืœืŸ ืฆื• ืงื•ืงืŸ ืื™ืŸ ื“ื™ ื™ืŸ ืคื•ืŸ ืœื™ื ื•ืงืก.

ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืฆื• ืžื™ื™ืŸ ืขืจืฉื˜ืขืจ ืึทืจื˜ื™ืงืœ ื“ืขืจืžืื ื˜ SoftEther VPN, ื•ื•ืึธืก ืงืขื ืขืŸ ื ืึธื›ืงืจื™ืžืขืŸ ืขื˜ืœืขื›ืข "ืจืขื’ื•ืœืขืจ" ืคึผืจืึธื˜ืึธืงืึธืœืก, ืกืคึผืขืฆื™ืขืœ ื”ื˜ื˜ืคึผืก, ICMP ืื•ืŸ ืืคื™ืœื• ื“ื ืก. ืื™ืš ืงืขืŸ ื™ืžืึทื“ื–ืฉืึทืŸ ื‘ืœื•ื™ื– ื“ืขืจ ืขืจืฉื˜ืขืจ ืคื•ืŸ ื–ื™ื™ ืืจื‘ืขื˜ืŸ, ื•ื•ื™ื™ึทืœ ืื™ืš ื‘ื™ืŸ ื–ื™ื™ืขืจ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื”ื˜ื˜ืคึผ (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, ื“ื™ ืžื ื•ื—ื” ื•ื•ืขื˜ ืงื•ืžืขืŸ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–. ืื™ืš ื•ื•ืขืœ ื ื™ืฉื˜ ืฆื•ืฉื˜ืขืœืŸ ื“ื™ ื’ืื ืฆืข ืงืึธื“ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืื™ืจ ืงืขื ืขืŸ ืงืœืึธื•ืŸ ืขืก ืื•ื™ืฃ 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 Echo ื–ืขื ืขืŸ ื“ืืจืฃ, ืึทื–ื•ื™ ืžื™ืจ ืคึผืึทืจืก ื“ื™ ื‘ืึทืคืขืจ ืžื™ื˜ ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ื•ื•ืึทืจืคืŸ ืึทืœืข ื ื™ื˜-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 ื›ืขื“ืขืจื–. ืžื™ื™ืŸ ืžื™ื ื™ืžืึทืœ ื•ื•ื™ืกืŸ ืคื•ืŸ 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, ืื™ืš ื”ืื‘ ื ื™ืฉื˜ ื’ืขืงื•ืงื˜ ืื™ืŸ ื“ืขื.

Assembly

ื“ื™ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืคื•ืŸ ืงืขืจืŸ ืžืึทื“ื–ืฉื•ืœื– ืื™ื– ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ื“ื•ืจืš ื“ื™ ืงืขืจืŸ ืžืึทื›ืŸ-ืคืจืึทืžืขื•ื•ืึธืจืง. ื’ืขืจื•ืคืŸ 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 ืื•ืŸ ืขืก ืื ื˜ื”ืืœื˜ ื“ื™ ื“ืื˜ื•ื ื•ื•ืืก ื“ื™ ืคืืจืœืื ื’ ืื™ื– ื’ืขืฉื™ืงื˜ ื’ืขื•ื•ืืจืŸ, ื“ืืก ืžื™ื™ื ื˜ ืื– ื“ื• ื”ืืกื˜ ืืœืขืก ื’ืขื˜ื•ืŸ ืจื™ื›ื˜ื™ื’ ืื•ืŸ ืื™ืš ื”ืื‘ ืืœืขืก ื’ืขื˜ื•ืŸ.

ืกืึธืฃ

ืžื™ื™ึทืŸ ืขืจืฉื˜ืขืจ ื“ืขืจืคืึทืจื•ื ื’ ืžื™ื˜ ื™ืึธื“ืขืจ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื™ื– ื’ืขื•ื•ืขืŸ ืคื™ืœ ื’ืจื™ื ื’ืขืจ ื•ื•ื™ ืื™ืš ื“ืขืจื•ื•ืึทืจื˜. ืืคื™ืœื• ืึธืŸ ื“ืขืจืคืึทืจื•ื ื’ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืื™ืŸ C, ืคืึธื•ืงื™ืกื™ื ื’ ืื•ื™ืฃ ืงืึทืžืคึผื™ื™ืœืขืจ ื”ื™ื ืฅ ืื•ืŸ Google ืจืขื–ื•ืœื˜ืึทื˜ืŸ, ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ื™ื›ื•ืœืช ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึท ืืจื‘ืขื˜ืŸ ืžืึธื“ื•ืœืข ืื•ืŸ ืคื™ืœืŸ ื•ื•ื™ ืึท ืงืขืจืŸ ื”ืขืงืขืจ, ืื•ืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜ ืึท ืฉืจื™ืคื˜ ืงื™ื“ื™. ืื™ืŸ ื“ืขืจืฆื•, ืื™ืš ื’ืขื’ืื ื’ืขืŸ ืฆื• ื“ื™ Kernel Newbies ืงืึทื ืึทืœ, ื•ื•ื• ื–ื™ื™ ื“ืขืจืฆื™ื™ืœื˜ ืžื™ืจ ืฆื• ื ื•ืฆืŸ schedule_work() ืื ืฉื˜ืื˜ ืจื•ืคืŸ call_usermodehelper() ื™ืŸ ื“ืขืจ ืงืจื•ืง ื–ื™ืš ืื•ืŸ ืฉืึทืžืขื“ ืื™ื, ืจืขื›ื˜ ืกืึทืกืคึผืขืงื˜ื™ื“ ืึท ืกืงืึทื. ื ื”ื•ื ื“ืขืจื˜ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“ ืงืึธืก ืžื™ืจ ื•ื•ืขื’ืŸ ืึท ื•ื•ืึธืš ืคื•ืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืื™ืŸ ืžื™ื™ืŸ ืคืจื™ื™ ืฆื™ื™ื˜. ื ื’ืขืจืึธื˜ืŸ ื“ืขืจืคืึทืจื•ื ื’ ื•ื•ืึธืก ื—ืจื•ื‘ึฟ ืžื™ื™ืŸ ืคืขืจื–ืขื ืœืขื›ืข ืžื™ื˜ืึธืก ื•ื•ืขื’ืŸ ื“ื™ ืึธื•ื•ื•ืขืจื•ื•ืขืœืžื™ื ื’ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืคื•ืŸ ืกื™ืกื˜ืขื ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’.

ืื•ื™ื‘ ืขืžืขืฆืขืจ ืฉื˜ื™ืžืขืŸ ืฆื• ื˜ืึธืŸ ืึท ืงืึธื“ ืจืขืฆืขื ื–ื™ืข ืื•ื™ืฃ Github, ืื™ืš ื•ื•ืขืœ ื–ื™ื™ืŸ ื“ืึทื ืงื‘ืึทืจ. ืื™ืš ื‘ื™ืŸ ื’ืึทื ืฅ ื–ื™ื›ืขืจ ืึทื– ืื™ืš ื’ืขืžืื›ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ื ืึทืจื™ืฉ ืžื™ืกื˜ื™ื™ืงืก, ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ืื™ืš ืึทืจื‘ืขื˜ ืžื™ื˜ ืกื˜ืจื™ื ื’ืก.

ื™ืึธื“ืขืจ ืฉืึธืœ ืื™ื‘ืขืจ ICMP

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’