ืคื’ื– ื’ืจืขื™ื ื™ ืžืขืœ ICMP

ืคื’ื– ื’ืจืขื™ื ื™ ืžืขืœ ICMP

TL; DR: ืื ื™ ื›ื•ืชื‘ ืžื•ื“ื•ืœ ืœื™ื‘ื” ืฉื™ืงืจื ืคืงื•ื“ื•ืช ืžืžื˜ืขืŸ ICMP ื•ื™ื‘ืฆืข ืื•ืชืŸ ื‘ืฉืจืช ื’ื ืื ื”-SSH ืฉืœืš ืงื•ืจืก. ืขื‘ื•ืจ ื—ืกืจื™ ื”ืกื‘ืœื ื•ืช, ื›ืœ ื”ืงื•ื“ ื”ื•ื GitHub.

ื–ึฐื”ึดื™ืจื•ึผืช! ืžืชื›ื ืชื™ C ืžื ื•ืกื™ื ืžืกืชื›ื ื™ื ื‘ืคืจื•ืฅ ื‘ื“ืžืขื•ืช ืฉืœ ื“ื! ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉืื ื™ ืืคื™ืœื• ื˜ื•ืขื” ื‘ื˜ืจืžื™ื ื•ืœื•ื’ื™ื”, ืื‘ืœ ื›ืœ ื‘ื™ืงื•ืจืช ืชืชืงื‘ืœ ื‘ื‘ืจื›ื”. ื”ืคื•ืกื˜ ืžื™ื•ืขื“ ืœืžื™ ืฉื™ืฉ ืœื• ืžื•ืฉื’ ื’ืก ืžืื•ื“ ืขืœ ืชื›ื ื•ืช C ื•ืจื•ืฆื™ื ืœื”ืกืชื›ืœ ืขืœ ื”ืฆื“ ื”ืคื ื™ืžื™ ืฉืœ ืœื™ื ื•ืงืก.

ื‘ืชื’ื•ื‘ื•ืช ืœืจืืฉื•ืŸ ืฉืœื™ ัั‚ะฐั‚ัŒะต ื”ื–ื›ื™ืจ ืืช SoftEther VPN, ืฉื™ื›ื•ืœ ืœื—ืงื•ืช ื›ืžื” ืคืจื•ื˜ื•ืงื•ืœื™ื "ืจื’ื™ืœื™ื", ื‘ืคืจื˜ HTTPS, ICMP ื•ืืคื™ืœื• DNS. ืื ื™ ื™ื›ื•ืœ ืœื“ืžื™ื™ืŸ ืฉืจืง ื”ืจืืฉื•ืŸ ืฉื‘ื”ื ืขื•ื‘ื“, ืžื›ื™ื•ื•ืŸ ืฉืื ื™ ืžื›ื™ืจ ืžืื•ื“ ืืช HTTP(S), ื•ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืœืžื•ื“ ืžื ื”ื•ืจ ื“ืจืš ICMP ื•-DNS.

ืคื’ื– ื’ืจืขื™ื ื™ ืžืขืœ ICMP

ื›ืŸ, ื‘ืฉื ืช 2020 ืœืžื“ืชื™ ืฉืืชื” ื™ื›ื•ืœ ืœื”ื›ื ื™ืก ืžื˜ืขืŸ ืฉืจื™ืจื•ืชื™ ืœืชื•ืš ืžื ื•ืช ICMP. ืื‘ืœ ืžื•ื˜ื‘ ืžืื•ื—ืจ ืžืืฉืจ ืืฃ ืคืขื! ื•ืžื›ื™ื•ื•ืŸ ืฉืืคืฉืจ ืœืขืฉื•ืช ืžืฉื”ื• ื‘ื ื™ื“ื•ืŸ, ืื– ืฆืจื™ืš ืœืขืฉื•ืช ืืช ื–ื”. ืžื›ื™ื•ื•ืŸ ืฉื‘ื—ื™ื™ ื”ื™ื•ืžื™ื•ื ืื ื™ ืžืฉืชืžืฉ ืœืจื•ื‘ ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื”, ื›ื•ืœืœ ื“ืจืš SSH, ื”ืจืขื™ื•ืŸ ืฉืœ ืžืขื˜ืคืช ICMP ืขืœื” ื‘ืจืืฉื™ ื‘ืจืืฉ. ื•ื›ื“ื™ ืœื”ืจื›ื™ื‘ ื‘ื™ื ื’ื• ื‘ื•ืœ ืžื’ืŸ ืฉืœื, ื”ื—ืœื˜ืชื™ ืœื›ืชื•ื‘ ืื•ืชื• ื›ืžื•ื“ื•ืœ ืœื™ื ื•ืงืก ื‘ืฉืคื” ืฉื™ืฉ ืœื™ ืจืง ืžื•ืฉื’ ื’ืก ืขืœื™ื”. ืžืขื˜ืคืช ื›ื–ื• ืœื ืชื”ื™ื” ื’ืœื•ื™ื” ื‘ืจืฉื™ืžืช ื”ืชื”ืœื™ื›ื™ื, ืืชื” ื™ื›ื•ืœ ืœื˜ืขื•ืŸ ืื•ืชื” ืœืชื•ืš ื”ืงืจื ืœ ื•ื”ื™ื ืœื ืชื”ื™ื” ื‘ืžืขืจื›ืช ื”ืงื‘ืฆื™ื, ืœื ืชืจืื” ืฉื•ื ื“ื‘ืจ ื—ืฉื•ื“ ื‘ืจืฉื™ืžืช ื™ืฆื™ืื•ืช ื”ื”ืื–ื ื”. ืžื‘ื—ื™ื ืช ื”ื™ื›ื•ืœื•ืช ืฉืœื•, ืžื“ื•ื‘ืจ ื‘-rootkit ืžืŸ ื”ืžื ื™ื™ืŸ, ืื‘ืœ ืื ื™ ืžืงื•ื•ื” ืœืฉืคืจ ืื•ืชื• ื•ืœื”ืฉืชืžืฉ ื‘ื• ื›ืžืขื˜ืคืช ืฉืœ ืžื•ืฆื ืื—ืจื•ืŸ ื›ืืฉืจ ืžืžื•ืฆืข ื”ื˜ืขื™ื ื” ื’ื‘ื•ื” ืžื“ื™ ื‘ืฉื‘ื™ืœ ืœื”ื™ื›ื ืก ื“ืจืš SSH ื•ืœื”ืคืขื™ืœ ืœืคื—ื•ืช echo i > /proc/sysrq-triggerื›ื“ื™ ืœืฉื—ื–ืจ ื’ื™ืฉื” ืœืœื ืืชื—ื•ืœ ืžื—ื“ืฉ.

ืื ื—ื ื• ืœื•ืงื—ื™ื ืขื•ืจืš ื˜ืงืกื˜, ื›ื™ืฉื•ืจื™ ืชื›ื ื•ืช ื‘ืกื™ืกื™ื™ื ื‘- Python ื•-C, ื’ื•ื’ืœ ื• ื•ื™ืจื˜ื•ืืœื™ ืฉืœื ืื›ืคืช ืœืš ืœืฉื™ื ืžืชื—ืช ืœืกื›ื™ืŸ ืื ื”ื›ืœ ื ืฉื‘ืจ (ืื•ืคืฆื™ื•ื ืœื™ - 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 ื‘ืขืฆืžื”. ืœื“ื‘ื™ืืŸ ื™ืฉ ื—ื‘ื™ืœื” ื‘ืฉื 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. ืฉื ื™ ืงื‘ืฆื™ ื›ื•ืชืจื•ืช ื ืžืฉื›ื™ื ื›ื“ื™ ืœืชืคืขืœ ืืช ื”ืžื•ื“ื•ืœ ืขืฆืžื• ื•ืืช ื”-netfilter.
  2. ื›ืœ ื”ืคืขื•ืœื•ืช ืขื•ื‘ืจื•ืช ื“ืจืš netfilter, ืืคืฉืจ ืœื”ื’ื“ื™ืจ ื‘ื• ื•ื•ื™ื. ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืืชื” ืฆืจื™ืš ืœื”ื›ืจื™ื– ืขืœ ื”ืžื‘ื ื” ืฉื‘ื• ื”ื•ื• ื™ื•ื’ื“ืจ. ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื‘ื™ื•ืชืจ ื”ื•ื ืœืฆื™ื™ืŸ ืืช ื”ืคื•ื ืงืฆื™ื” ืฉืชืชื‘ืฆืข ื›-hook: nfho.hook = icmp_cmd_executor; ืื ื™ ืื’ื™ืข ืœืคื•ื ืงืฆื™ื” ืขืฆืžื” ืžืื•ื—ืจ ื™ื•ืชืจ.
    ื•ืื– ืงื‘ืขืชื™ ืืช ื–ืžืŸ ื”ืขื™ื‘ื•ื“ ืฉืœ ื”ื—ื‘ื™ืœื”: NF_INET_PRE_ROUTING ืžืฆื™ื™ืŸ ืœืขื‘ื“ ืืช ื”ื—ื‘ื™ืœื” ื›ืืฉืจ ื”ื™ื ืžื•ืคื™ืขื” ืœืจืืฉื•ื ื” ื‘ืงืจื ืœ. ื™ื›ื•ืœ ืœืฉืžืฉ NF_INET_POST_ROUTING ืœืขื‘ื“ ืืช ื”ื—ื‘ื™ืœื” ื›ืฉื”ื™ื ื™ื•ืฆืืช ืžื”ืงืจื ืœ.
    ื”ื’ื“ืจืชื™ ืืช ื”ืžืกื ืŸ ืœ-IPv4: nfho.pf = PF_INET;.
    ืื ื™ ื ื•ืชืŸ ืœื”ื•ืง ืฉืœื™ ืืช ื”ืขื“ื™ืคื•ืช ื”ื’ื‘ื•ื”ื” ื‘ื™ื•ืชืจ: nfho.priority = NF_IP_PRI_FIRST;
    ื•ืื ื™ ืจื•ืฉื ืืช ืžื‘ื ื” ื”ื ืชื•ื ื™ื ื‘ืชื•ืจ ื”-hook ื‘ืคื•ืขืœ: 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 ื•ื”ื ืงื™ื ืžืฉืชืžืฉื™ื ื‘ืžืกื’ืจืช ื–ื• ืœื—ืœื•ื˜ื™ืŸ. 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, ืชื•ืš ื”ืชืžืงื“ื•ืช ื‘ืจืžื–ื™ื ืœืžื”ื“ืจื™ื ื•ื‘ืชื•ืฆืื•ืช ืฉืœ ื’ื•ื’ืœ, ื”ืฆืœื—ืชื™ ืœื›ืชื•ื‘ ืžื•ื“ื•ืœ ืขื•ื‘ื“ ื•ืœื”ืจื’ื™ืฉ ื›ืžื• ื”ืืงืจ ืœื™ื‘ื”, ื•ื‘ืื•ืชื• ื”ื–ืžืŸ ื™ืœื“ ืฉืœ ืกืงืจื™ืคื˜. ื‘ื ื•ืกืฃ, ื”ืœื›ืชื™ ืœืขืจื•ืฅ Kernel Newbies, ืฉื ืืžืจื• ืœื™ ืœื”ืฉืชืžืฉ schedule_work() ื‘ืžืงื•ื ืœื”ืชืงืฉืจ call_usermodehelper() ื‘ืชื•ืš ื”ืงืจืก ืขืฆืžื• ื•ื”ื‘ื™ื™ืฉ ืื•ืชื•, ื‘ืฆื“ืง ื—ื•ืฉื“ ื‘ื”ื•ื ืื”. ืžืื” ืฉื•ืจื•ืช ืงื•ื“ ืขืœื• ืœื™ ื‘ืขืจืš ืฉื‘ื•ืข ืฉืœ ืคื™ืชื•ื— ื‘ื–ืžื ื™ ื”ืคื ื•ื™. ื—ื•ื•ื™ื” ืžื•ืฆืœื—ืช ืฉื”ืจืกื” ืืช ื”ืžื™ืชื•ืก ื”ืื™ืฉื™ ืฉืœื™ ืขืœ ื”ืžื•ืจื›ื‘ื•ืช ื”ืžื•ื—ืฆืช ืฉืœ ืคื™ืชื•ื— ืžืขืจื›ืช.

ืื ืžื™ืฉื”ื• ื™ืกื›ื™ื ืœืขืฉื•ืช ืกืงื™ืจืช ืงื•ื“ ื‘- Github, ืื ื™ ืื•ื“ื” ืœื•. ืื ื™ ื“ื™ ื‘ื˜ื•ื— ืฉืขืฉื™ืชื™ ื”ืจื‘ื” ื˜ืขื•ื™ื•ืช ื˜ื™ืคืฉื™ื•ืช, ื‘ืžื™ื•ื—ื“ ื›ืฉืขื‘ื“ืชื™ ืขื ืžื—ืจื•ื–ื•ืช.

ืคื’ื– ื’ืจืขื™ื ื™ ืžืขืœ ICMP

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”