αž‚αŸ’αžšαžΆαž”αŸ‹αž“αž»αž™αž€αŸ’αž›αŸαž’αŸŠαŸ‚αžšαž›αžΎ ICMP

αž‚αŸ’αžšαžΆαž”αŸ‹αž“αž»αž™αž€αŸ’αž›αŸαž’αŸŠαŸ‚αžšαž›αžΎ ICMP

TL; αž€αž»αž„αŸ– αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžαžΊαžŽαŸ‚αž›αžŠαŸ‚αž›αž“αžΉαž„αž’αžΆαž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αžΈ ICMP payload αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αž½αž€αžœαžΆαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆ SSH αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‚αžΆαŸ†αž„αž€αŸαžŠαŸ„αž™αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αžαŸ‹αž’αŸ’αž˜αžαŸ‹αž”αŸ†αž•αž»αž αž€αžΌαžŠαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊ GitHub.

αž”αŸ’αžšαž™αŸαžαŸ’αž“ αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ C αžŠαŸ‚αž›αž˜αžΆαž“αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸ αž”αŸ’αžšαžαž»αž™αžŸαŸ’αžšαž€αŸ‹αž‘αžΉαž€αž—αŸ’αž“αŸ‚αž€! αžαŸ’αž‰αž»αŸ†β€‹αž’αžΆαž…β€‹αž“αžΉαž„β€‹αžαž»αžŸβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αžœαžΆαž€αŸ’αž™β€‹αžŸαž–αŸ’αž‘β€‹, αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž€αžΆαžšβ€‹αžšαž·αŸ‡αž‚αž“αŸ‹β€‹αžŽαžΆβ€‹αž˜αž½αž™β€‹αžŸαžΌαž˜β€‹αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸβ€‹αŸ” αž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αž“αŸαŸ‡αž‚αžΊαž˜αžΆαž“αž‚αŸ„αž›αž”αŸ†αžŽαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž˜αžΆαž“αž‚αŸ†αž“αž·αžαžšαžŠαž»αž”αžαŸ’αž›αžΆαŸ†αž„αž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ C αž αžΎαž™αž…αž„αŸ‹αžšαž€αž˜αžΎαž›αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αž“αž»αž„αž“αŸƒαž›αžΈαž“αž»αž…αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž‘αŸ…αžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž’αžαŸ’αžαž”αž‘ αž”αžΆαž“αž›αžΎαž€αž‘αžΎαž„αž–αžΈ SoftEther VPN αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž–αž·αž’αžΈαž€αžΆαžš "αž’αž˜αŸ’αž˜αžαžΆ" αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž‡αžΆαž–αž·αžŸαŸαžŸ HTTPS, ICMP αž“αž·αž„αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚ DNS αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž’αžΆαž…β€‹αžŸαŸ’αžšαž˜αŸƒβ€‹αžƒαžΎαž‰β€‹αžαŸ‚β€‹αž–αž½αž€αž‚αŸβ€‹αžŠαŸ†αž”αžΌαž„β€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αžœαžΎαž€αžΆαžš αž–αŸ’αžšαŸ„αŸ‡β€‹αžαŸ’αž‰αž»αŸ†β€‹αžŸαŸŠαžΆαŸ†β€‹αž‡αžΆαž˜αž½αž™ HTTP(S) αž αžΎαž™β€‹αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αžšαŸ€αž“β€‹αž•αŸ’αž›αžΌαžœβ€‹αžšαžΌαž„β€‹αž€αŸ’αžšαŸ„αž˜β€‹αžŠαžΈβ€‹αž›αžΎ ICMP αž“αž·αž„ DNSαŸ”

αž‚αŸ’αžšαžΆαž”αŸ‹αž“αž»αž™αž€αŸ’αž›αŸαž’αŸŠαŸ‚αžšαž›αžΎ ICMP

αž”αžΆαž‘/αž…αžΆαžŸ αž“αŸ…αž†αŸ’αž“αžΆαŸ† 2020 αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαžΉαž„αžαžΆαž’αŸ’αž“αž€αž’αžΆαž…αž”αž‰αŸ’αž…αžΌαž›αž”αž“αŸ’αž‘αž»αž€αžαžΆαž˜αž’αŸ†αž–αžΎαž…αž·αžαŸ’αžαž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹ ICMP αŸ” αžαŸ‚αž™αžΊαžαž‡αžΆαž„αž˜αž·αž“αžŠαŸ‚αž›! αž αžΎαž™β€‹αžŠαŸ„αž™αžŸαžΆαžšβ€‹αž’αŸ’αžœαžΈβ€‹αž˜αž½αž™β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž’αŸ’αžœαžΎβ€‹αž’αŸ†αž–αžΈβ€‹αžœαžΆ αž“αŸ„αŸ‡β€‹αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αž’αŸ’αžœαžΎαŸ” αžŠαŸ„αž™αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‡αžΈαžœαž·αžαž”αŸ’αžšαž…αžΆαŸ†αžαŸ’αž„αŸƒαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αžšαž½αž˜αž‘αžΆαŸ†αž„αžαžΆαž˜αžšαž™αŸˆ SSH αž‚αŸ†αž“αž·αžαž“αŸƒαžŸαŸ‚αž› ICMP αž”αžΆαž“αž…αžΌαž›αž˜αž€αž€αŸ’αž“αž»αž„αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‡αžΆαž˜αž»αž“αžŸαž·αž“αŸ” αž αžΎαž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† bullshield bingo αž–αŸαž‰αž›αŸαž‰ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžšαžŸαŸαžšαžœαžΆαž‡αžΆαž˜αŸ‰αžΌαžŒαž»αž›αž›αžΈαž“αž»αž…αž‡αžΆαž—αžΆαžŸαžΆαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αžΆαž“αž‚αŸ†αž“αž·αžαžšαžŠαž»αž”αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŸαŸ‚αž›αž”αŸ‚αž”αž“αŸαŸ‡αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‘αž»αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› αž αžΎαž™αžœαžΆαž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαž‘αŸ αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αžƒαžΎαž‰αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αž½αžšαž±αŸ’αž™αžŸαž„αŸ’αžŸαŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž…αŸ’αžšαž€αžŸαŸ’αžαžΆαž”αŸ‹αž‘αŸαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆ αž“αŸαŸ‡αž‚αžΊαž‡αžΆ rootkit αž–αŸαž‰αž›αŸαž‰ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž“αžΉαž„αž€αŸ‚αž›αž˜αŸ’αž’αžœαžΆ αž αžΎαž™αž”αŸ’αžšαžΎαžœαžΆαž‡αžΆαžŸαŸ‚αž›αž“αŸƒαž‡αž˜αŸ’αžšαžΎαžŸαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› Load Average αžαŸ’αž–αžŸαŸ‹αž–αŸαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΌαž›αžαžΆαž˜αžšαž™αŸˆ SSH αž αžΎαž™αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αŸ” echo i > /proc/sysrq-triggerαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžŠαžΆαžšαž€αžΆαžšαž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αŸ”

αž™αžΎαž„αž™αž€αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αž·αž–αž“αŸ’αž’αž’αžαŸ’αžαž”αž‘ αž‡αŸ†αž“αžΆαž‰αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ Python αž“αž·αž„ C, Google αž“αž·αž„ αž“αž·αž˜αŸ’αž˜αž·αž αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αžαŸ’αžœαž›αŸ‹β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž“αŸ…β€‹αž€αŸ’αžšαŸ„αž˜β€‹αž€αžΆαŸ†αž”αž·αžβ€‹αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αžαžΌαž… (αž‡αžΆβ€‹αž‡αž˜αŸ’αžšαžΎαžŸ - Local VirtualBox/KVM/etc) αž αžΎαž™β€‹αžαŸ„αŸ‡β€‹αž‘αŸ…!

αžαžΆαž„αž’αžαž·αžαž·αž‡αž“

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαŸ’αž‰αž»αŸ†αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž’αžαž·αžαž·αž‡αž“αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαž αŸ‚αž› 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!

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžœαžΆαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž‡αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ sniffer
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. αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ netfilter αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž‘αŸ†αž–αž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ’αžšαž€αžΆαžŸαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž‘αŸ†αž–αž€αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž‚αžΊαžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαž‘αŸ†αž–αž€αŸ‹αŸ– 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() αž€αŸ†αžŽαžαŸ‹αž˜αž»αžαž„αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αž˜αŸ‰αžΌαžŒαž»αž›αŸ”

αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž”αž“αŸ’αž‘αž»αž€αž‘αžΎαž„αžœαž·αž‰

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž‘αžΆαž‰αž™αž€ payload αž“αŸαŸ‡αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸαž›αŸ†αž”αžΆαž€αž”αŸ†αž•αž»αžαŸ” αžαžΊαžŽαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αž“αŸ’αž‘αž»αž€αž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αž‰αŸ‚αž€αžαŸ‚αž”αž‹αž˜αž€αžαžΆαž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

#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. αž αŸαžαž»αž’αŸ’αžœαžΈαž“αŸαŸ‡? αž–αŸ’αžšαŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αž…αž„αž€αŸ’αžšαž„β€‹αžαŸ’αž’αžΌαž‰αžαŸ’αž’αŸ‚αžšβ€‹αž–αžΈβ€‹αžœαžΆ! αž–αž½αž€αž‚αŸαž”αžΆαž“αžŸαŸ’αž“αžΎαž˜αž€αžαŸ’αž‰αž»αŸ†αžšαž½αž…αž αžΎαž™αžαžΆ αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαžαŸ‚αž™αž›αŸ‹αž’αŸ†αž–αžΈ stack αž“αž·αž„ heap αž“αŸ…αžαŸ’αž„αŸƒαžŽαžΆαž˜αž½αž™ αžαŸ’αž‰αž»αŸ†αž–αž·αžαž‡αžΆαž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆ αž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ‚αž˜αž‘αžΆαŸ†αž„αž€αŸ‚αž€αžΌαžŠαž‘αŸ€αžαž•αž„αŸ” αžαŸ’αž‰αž»αŸ†αž€αŸ†αžŽαžαŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž—αŸ’αž›αžΆαž˜αŸ—αŸ– char cmd_string[MAX_CMD_LEN];. αžœαžΆβ€‹αž‚αž½αžšβ€‹αžαŸ‚β€‹αž˜αžΎαž›β€‹αžƒαžΎαž‰β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž˜αž»αžαž„αžΆαžšβ€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹ αžαŸ’αž‰αž»αŸ†β€‹αž“αžΉαž„β€‹αž“αž·αž™αžΆαž™β€‹αž’αŸ†αž–αžΈβ€‹αžœαžΆβ€‹αž™αŸ‰αžΆαž„β€‹αž›αž˜αŸ’αž’αž·αžβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžαžΆαžαžŽαŸ’αžŒ 9 αŸ”
  3. αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ (struct work_struct my_work;) αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž—αŸ’αž‡αžΆαž”αŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž˜αž»αžαž„αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αž (DECLARE_WORK(my_work, work_handler);) αžαŸ’αž‰αž»αŸ†β€‹αž€αŸβ€‹αž“αžΉαž„β€‹αž“αž·αž™αžΆαž™β€‹αž•αž„αžŠαŸ‚αžšβ€‹αž’αŸ†αž–αžΈβ€‹αž˜αžΌαž›αž αŸαžαž»β€‹αžŠαŸ‚αž›β€‹αžœαžΆβ€‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžαžΆαžαžŽαŸ’αžŒβ€‹αž‘αžΈβ€‹αž”αŸ’αžšαžΆαŸ†αž”αž½αž“β€‹αŸ”
  4. αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαž€αžΆαžŸαž˜αž»αžαž„αžΆαžšαž˜αž½αž™ αžŠαŸ‚αž›αž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž‘αŸ†αž–αž€αŸ‹αŸ” αž”αŸ’αžšαž—αŸαž‘ αž“αž·αž„αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αžŠαŸ‚αž›αž‘αž‘αž½αž›αž™αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™ netfilter αž™αžΎαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ skb. αž“αŸαŸ‡αž‚αžΊαž‡αžΆ socket buffer αžŠαŸ‚αž›αž‡αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž’αŸ†αž–αžΈαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ”
  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αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž˜αžΎαž›αžœαžΆαž‘αŸαŸ”

αžŸαž“αŸ’αž“αž·αž”αžΆαž

αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαž˜αŸ‰αžΌαžŒαž»αž›αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž™αŸˆαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž”αž„αŸ’αž€αžΎαžαžαžΊαžŽαŸ‚αž›αŸ” αž”αžΆαž“αž αŸ… 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 αžŠαŸ„αž™αž•αŸ’αžαŸ„αžαž›αžΎαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž…αž„αž€αŸ’αžšαž„ αž“αž·αž„αž›αž‘αŸ’αž’αž•αž› Google αž€αŸαžŠαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αžŸαžšαžŸαŸαžšαž˜αŸ‰αžΌαžŒαž»αž›αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž€αžΆαžš αž αžΎαž™αž˜αžΆαž“αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžαžΆαžŠαžΌαž…αž‡αžΆαž’αŸ’αž“αž€αž›αž½αž…αž˜αžΎαž›αžαžΊαžŽαŸ‚αž› αž αžΎαž™αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™ script kiddie αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‘αŸ…αž†αžΆαž“αŸ‚αž› Kernel Newbies αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž”αŸ’αžšαžΆαž”αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎ schedule_work() αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ call_usermodehelper() αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αž€αŸ‹αžαŸ’αž›αž½αž“αž―αž„ αž αžΎαž™αž’αŸ’αžœαžΎαž±αŸ’αž™αž‚αžΆαžαŸ‹αžαŸ’αž˜αžΆαžŸαŸ‹αž’αŸ€αž“ αžŸαž„αŸ’αžŸαŸαž™αžαžΆαž‡αžΆαž€αžΆαžšαž”αŸ„αž€αž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž€αžΌαžŠαž˜αž½αž™αžšαž™αž”αž“αŸ’αž‘αžΆαžαŸ‹αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αž…αŸ†αžŽαžΆαž™αž”αŸ’αžšαž αŸ‚αž›αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž“αŸ…αž–αŸαž›αž‘αŸ†αž“αŸαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ” αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž‡αŸ„αž‚αž‡αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ†αž•αŸ’αž›αžΆαž‰αž‘αŸαžœαž€αžαžΆαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž’αŸ†αž–αžΈαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŠαŸαž›αžΎαžŸαž›αž”αŸ‹αž“αŸƒαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž™αž›αŸ‹αž–αŸ’αžšαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΌαžŠαž“αŸ…αž›αžΎ Github αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžŠαžΉαž„αž‚αž»αžŽαŸ” αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΆαž€αžŠαžαžΆαžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž€αŸ†αž αž»αžŸαž†αŸ’αž‚αž„αž‡αžΆαž…αŸ’αžšαžΎαž“ αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαŸ”

αž‚αŸ’αžšαžΆαž”αŸ‹αž“αž»αž™αž€αŸ’αž›αŸαž’αŸŠαŸ‚αžšαž›αžΎ ICMP

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹