TL; AMA: O loʻo ou tusia se module kernel o le a faitau poloaiga mai le uta ICMP ma faʻatino i luga o le 'auʻaunaga tusa lava pe paʻu lau SSH. Mo le sili ona le onosai, o le code uma lava .
Faʻaeteete! O tagata fai polokalame C poto masani e ono tafe mai i loimata o le toto! Atonu foi ou te sese i faaupuga, ae o soo se faitioga e talia. O le pou e faʻamoemoe mo i latou o loʻo i ai se manatu faigata tele o polokalame C ma manaʻo e vaʻai i totonu o Linux.
I faʻamatalaga i laʻu muamua taʻua SoftEther VPN, lea e mafai ona faʻataʻitaʻiina nisi o tulafono masani, aemaise lava HTTPS, ICMP ma e oʻo lava i DNS. E mafai ona ou mafaufauina pe faʻapefea ona galue muamua, talu ai ou te masani tele i le HTTP (S), ma e tatau ona ou aʻoaʻoina le tunneling i luga ole ICMP ma DNS.

Ioe, i le 2020 na ou aʻoaʻoina e mafai ona e faʻaofiina se totogi faʻapitoa i totonu o pusa ICMP. Ae sili atu le tuai nai lo le leai! Ma talu ai e mafai ona faia se mea e uiga i ai, o lona uiga e tatau ona faia. Talu ai i loʻu olaga i aso uma e masani ona ou faʻaaogaina le laina o le poloaiga, e aofia ai le SSH, o le manatu o se atigi ICMP na oʻo mai i loʻu mafaufau muamua. Ma ina ia mafai ona faʻapotopotoina se bingo bullshield atoatoa, na ou filifili ai e tusi o se Linux module i se gagana e naʻo soʻu manatu faigata. O sea atigi o le a le vaaia i le lisi o faiga, e mafai ona e utaina i totonu o le fatu ma o le a le i luga o le faila faila, e te le vaʻai i se mea masalosalo i le lisi o faʻalogo ports. E tusa ai ma ona gafatia, o se rootkit atoatoa lea, ae ou te faʻamoemoe e faʻaleleia ma faʻaaogaina e fai ma atigi mulimuli pe a maualuga tele le Load Average e ulufale ai e ala i le SSH ma faʻatino a itiiti ifo. echo i > /proc/sysrq-triggere toe fa'afo'i le avanoa e aunoa ma le toe fa'afouina.
Matou te ave se tusitala tusitusiga, tomai faʻavae polokalame ile Python ma C, Google ma lea e te le mafaufau e tuʻu i lalo o le naifi pe a malepe mea uma (filifiliga - VirtualBox / KVM / etc) ma tatou o!
Itu fa'atau
Na foliga mai ia te aʻu o le vaega a le tagata o tausia e tatau ona ou tusia se tala e tusa ma le 80 laina, ae sa i ai tagata agalelei na faia mo au. . O le faʻailoga na faʻafuaseʻi ona faigofie, fetaui i laina taua e 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() O le tusitusiga e lua finauga, o se tuatusi ma se uta. Aʻo leʻi tuʻuina atu, o le uta e muamua i se ki run:, o le a matou manaʻomia e faʻateʻaina ai afifi faʻatasi ai ma uta faʻafuaseʻi.
O le fatu e manaʻomia avanoa e faʻapipiʻi ai afifi, o lea e tatau ai ona faʻatautaia le tusitusiga e avea ma superuser. Aua nei galo e tuuina atu faatagaga faatino ma faapipii scapy lava. Debian ei ai se afifi e taʻua python3-scapy. Ole taimi nei e mafai ona e siaki pe fa'afefea uma.
Tamomoe ma fa'aulufaleina le fa'atonuga
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!
O le mea lea e foliga mai i le sogisogi
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 taufetuli:Talofa, lalolagi
0010 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Uumi: 17]
Fa'avaa 2: 59 paita i luga o le uaea (472 bits), 59 paita na pu'eina (472 bits) i luga o le interface wlp1s0, id 0
Initaneti Protocol Version 4, Src: 45.11.26.232, Dst: 192.168.0.240
Polokalama Fe'au Pulea Initaneti
Ituaiga: 0 (Echo (ping) tali)
Tulafono: 0
Su'ega: 0xde03 [sa'o] [Tulaga Siaki: Lelei] Fa'ailoa (BE): 0 (0x0000)
Fa'ailoa (LE): 0 (0x0000)
Numera fa'asologa (BE): 0 (0x0000)
Numera fa'asologa (LE): 0 (0x0000)
[Faava o talosaga: 1] [Taimi tali: 19.094 ms] Fa'amaumauga (17 paita)
0000 72 75 6e 3a 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 taufetuli:Talofa, lalolagi
0010 !
Data: 72756e3a48656c6c6f2c20776f726c6421
[Uumi: 17]
^C2 pepa na pu'eina
E le suia le uta i le afifi tali.
Kernel module
Ina ia fausia i totonu o se masini komepiuta Debian e te manaʻomia a itiiti ifo make и linux-headers-amd64, o isi mea o le a o'o mai i tulaga fa'alagolago. O le a ou le tuʻuina atu le code atoa i le tusiga e mafai ona e faʻapipiʻi ile Github.
Seti matau
I le amataga, matou te manaʻomia ni galuega se lua e faʻapipiʻi ai le module ma faʻapipiʻi. E le manaʻomia le galuega mo le laʻuina o uta, ae o lea rmmod o le a le aoga;
#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);O le a le mea o loʻo tupu iinei:
- E lua faila ulutala e tosoina i totonu e faʻaogaina le module lava ia ma le netfilter.
- O gaioiga uma e alu i totonu o le netfilter, e mafai ona e setiina ni matau i totonu. Ina ia faia lenei mea, e tatau ona e faʻaalia le fausaga o le a faʻapipiʻi ai le matau. O le mea pito sili ona taua o le faʻamaonia lea o le galuega o le a faʻatinoina o se matau:
nfho.hook = icmp_cmd_executor;O le a ou alu i le galuega lava ia mulimuli ane.
Ona ou setiina lea o le taimi galue mo le afifi:NF_INET_PRE_ROUTINGfa'amaoti mai e fa'agasolo le afifi pe a fa'aalia muamua ile fatu. E mafai ona fa'aaogainaNF_INET_POST_ROUTINGe fa'agasolo le afifi pe a alu ese mai le fatu.
Ua ou setiina le faamama i le IPv4:nfho.pf = PF_INET;.
Ou te tuuina atu la'u matau le faamuamua aupito maualuga:nfho.priority = NF_IP_PRI_FIRST;
Ma ou te resitalaina le fausaga o faʻamaumauga e pei o le matau moni:nf_register_net_hook(&init_net, &nfho); - O le galuega mulimuli e aveese ai le matau.
- O le laisene o loʻo faʻaalia manino ina ia le faitio le tagata faʻapipiʻi.
- Galuega tauave
module_init()иmodule_exit()seti isi galuega e amatalia ma faamutaina le module.
Toe aumai le uta
O lea la e tatau ona tatou aveese le uta, o le mea lea na avea ma galuega sili ona faigata. O le fatu e leai ni galuega faʻapipiʻi mo le galue i uta;
#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;
}O le a le mea o tupu:
- Sa tatau ona ou aofia ai faila faila faaopoopo, o le taimi lenei e faʻaogaina ai ulutala IP ma ICMP.
- Ou te setiina le umi o laina maualuga:
#define MAX_CMD_LEN 1976. Aisea tonu lea? Aua ua faitio le tagata tuufaatasia! Ua uma ona latou fautua mai ia te aʻu e tatau ona ou malamalama i le faaputuga ma le faaputuga, o le a i ai se aso ou te faia ai lenei mea ma atonu foi e faasaʻo le code. Na vave ona ou setiina le laina o le ai ai le poloaiga:char cmd_string[MAX_CMD_LEN];. E tatau ona faʻaalia i galuega uma; O le a ou talanoa atili e uiga i lenei mea ile parakalafa 9. - Ole taimi nei e tatau ona tatou amata (
struct work_struct my_work;) fausaga ma faʻafesoʻotaʻi ma se isi galuega (DECLARE_WORK(my_work, work_handler);). O le a ou talanoa foi pe aisea e tatau ai i le parakalafa lona iva. - O lea ou te folafola atu se galuega, lea o le a avea ma matau. O le ituaiga ma le taliaina o finauga e fa'atonuina e le netfilter, matou te fiafia i ai
skb. Ole socket buffer, ose fa'amaumauga fa'avae e iai fa'amatalaga avanoa uma e uiga i se afifi. - Mo le galuega e galue, e te manaʻomia ni fausaga se lua ma ni fesuiaiga, e aofia ai le lua iterators.
struct iphdr *iph; struct icmphdr *icmph; unsigned char *user_data; unsigned char *tail; unsigned char *i; int j = 0; - E mafai ona tatou amata i le manatu. Mo le faʻaogaina o le module, e leai ni paʻu e ese mai i le ICMP Echo e manaʻomia, o lea matou te faʻapipiʻi ai le paʻu e faʻaaoga ai galuega faʻapipiʻi ma lafo ese uma pepa e le o ICMP ma non-Echo. Toe fo'i
NF_ACCEPTo lona uiga o le taliaina o le afifi, ae e mafai foi ona e tuʻuina afifi e ala i le toe foʻi maiNF_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; }Ou te leʻi faʻataʻitaʻiina le mea o le a tupu e aunoa ma le siakiina o ulutala IP. O lo'u iloa itiiti o le C e ta'u mai ai a aunoa ma ni siaki fa'aopoopo, e ono tupu se mea mata'utia. O le a ou fiafia pe a e taofia aʻu i lenei mea!
- I le taimi nei o le afifi o le ituaiga tonu e te manaʻomia, e mafai ona e suʻeina faʻamaumauga. A aunoa ma se galuega faʻapipiʻi, e tatau ona e mauaina muamua se faʻailoga i le amataga o le uta. E faia lenei mea i se nofoaga e tasi, e tatau ona e ave le faʻailoga i le amataga o le ulutala ICMP ma faʻanofo i le tele o lenei ulutala. O mea uma e faʻaaogaina fausaga
icmph:user_data = (unsigned char *)((unsigned char *)icmph + (sizeof(icmph)));
O le pito o le ulutala e tatau ona fetaui ma le pito o le uta i totonuskb, o lea matou te maua ai e faʻaaoga ai auala faaniukilia mai le fausaga tutusa:tail = skb_tail_pointer(skb);.
Na gaoia le ata , e mafai ona e faitau atili e uiga i le socket buffer. - A maua loa au fa'asino ile amataga ma le fa'ai'uga, e mafai ona e kopiina fa'amaumauga i se manoa
cmd_string, siaki mo le iai o se prefixrun:ma, a le tia'i le afifi pe a misi, pe toe tusi le laina, aveese lenei prefix. - O le mea lena, o lea e mafai ona e valaʻau i se isi tagata faʻatau:
schedule_work(&my_work);. Talu ai e le mafai ona pasi se parakalafa i sea valaʻau, o le laina ma le poloaiga e tatau ona faʻavaomalo.schedule_work()o le a tuʻuina le galuega e fesoʻotaʻi ma le fausaga ua pasia i totonu o le laina lautele o le faʻatulagaina o galuega ma faʻamaeʻa, faʻatagaina oe e le faʻatali mo le faʻatonuga e maeʻa. E tatau lenei mea ona e tatau ona matua televave le matau. A leai, o lau filifiliga o le leai o se mea e amata pe o le ae maua se kernel panic. O le tuai e pei o le oti! - O le mea lena, e mafai ona e talia le afifi ma se toe faafoi tutusa.
Valaauina se polokalame ile userspace
O lenei galuega e sili ona malamalama. O lona igoa na tuuina mai i totonu DECLARE_WORK(), o le ituaiga ma finauga taliaina e le manaia. Matou te ave le laina ma le poloaiga ma pasi atoa i le atigi. Tuu atu ia te ia e taulimaina le parsing, saili mo binaries ma isi mea uma.
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);
}- Seti finauga i se seti o manoa
argv[]. Ou te manatu e iloa e tagata uma o polokalame o loʻo faʻatinoina i lenei auala, ae le o se laina faʻaauau ma avanoa. - Seti suiga ole siosiomaga. Na ou faʻaofiina naʻo le PATH ma se seti maualalo o auala, faʻamoemoe ua uma ona tuʻufaʻatasia
/binс/usr/binи/sbinс/usr/sbin. O isi auala e seasea taua i le faatinoga. - Ua uma, tatou faia! Galulue fatu
call_usermodehelper()talia le ulufale. ala i le binary, array of arguments, array of environment variables. O iinei ou te manatu foi e malamalama tagata uma i le uiga o le pasia o le ala i le faila faila o se finauga ese, ae e mafai ona e fesili. O le finauga mulimuli e fa'amaoti mai pe fa'atali mo le fa'agasologa e mae'a (UMH_WAIT_PROC), amata le faagasologa (UMH_WAIT_EXEC) pe le faatali lava (UMH_NO_WAIT). E i ai nisi meaUMH_KILLABLE, Ou te lei tilotilo i ai.
Fono Aoao
O le fa'apotopotoina o fa'aoga fatu e fa'atinoina e ala i le fa'a-fa'a-fa'ameamea. Valaau make i totonu o se lisi faʻapitoa e nonoa i le kernel version (faʻamatalaina iinei: KERNELDIR:=/lib/modules/$(shell uname -r)/build), ma o le nofoaga o le module e pasi atu i le fesuiaiga M i finauga. O le icmpshell.ko ma sini mama e faʻaogaina atoa lenei faʻavae. IN obj-m o lo'o fa'ailoa mai ai le faila faila o le a liua i se module. Syntax e toe faia main.o в icmpshell.o (icmpshell-objs = main.o) e le fetaui lelei ia te aʻu, ae ia faʻapea.
KERNELDIR:=/lib/modules/$(shell uname -r)/build
obj-m = icmpshell.o
icmpshell-objs = main.o
uma: icmpshell.ko
icmpshell.ko:main.c
fai -C $(KERNELDIR) M=$(PWD) modules
mama:
fai -C $(KERNELDIR) M=$(PWD) mama
Matou te aoina: make. utaina: insmod icmpshell.ko. Ua uma, e mafai ona e siaki: sudo ./send.py 45.11.26.232 "date > /tmp/test". Afai ei ai sau faila i lau masini /tmp/test ma o loʻo i ai le aso na tuʻuina atu ai le talosaga, o lona uiga na e faia mea uma ma saʻo na ou faia mea uma.
iʻuga
O loʻu aafiaga muamua i le atinaʻeina faaniukilia sa sili atu ona faigofie nai lo le mea na ou faʻamoemoeina. E tusa lava pe leai se poto masani e atiaʻe i le C, e taulaʻi atu i faʻamatalaga tuʻufaʻatasia ma Google iʻuga, na mafai ona ou tusia se module galue ma lagona e pei o se fatu hacker, ma i le taimi lava e tasi o se tamaititi tusitusi. E le gata i lea, na ou alu i le Kernel Newbies channel, lea na latou fai mai ai ou te faʻaoga schedule_work() nai lo le valaau call_usermodehelper() i totonu o le matau lava ia ma faalumaina o ia, ma sa'o le masalomia o se taufaavalea. O le selau o laina code na tau ia te aʻu e tusa ma le vaiaso o le atinaʻe i loʻu taimi avanoa. O se aafiaga manuia na fa'aumatia ai a'u lava tala fa'asolopito e uiga i le lavelave tele o le atina'eina o faiga.
Afai e malie se tasi e fai se iloiloga faʻailoga ile Github, ou te faʻafetai. Ou te mautinoa lava sa ou faia le tele o mea sese faavalevalea, aemaise lava pe a galue i manoa.
puna: www.habr.com

