Перейти к основному содержимому

Bandit Level 20

локальный «сервер» nc, который сразу отправил строку-пароль в сокет и подождал ответ. SUID-клиент suconnect подключился, сверил пароль и вернул пароль следующего уровня. Потоки мы перехватили редиректами.

Разбор по частям команды:

nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21 &
./suconnect 12345
wait $pid
cat ./p21

1) nc -l -p 12345 -q 1 < ... > ... &

  • nc --- netcat.

  • -l --- слушать входящее TCP-соединение.

  • -p 12345 --- порт прослушивания. Любой >1024.

  • -q 1 --- после конца stdin подождать 1 секунду и выйти. Нужно, чтобы успеть принять ответ от suconnect после того как мы уже «отправили» пароль.

  • < /etc/bandit_pass/bandit20 --- подаёт содержимое файла в stdin nc. То есть при подключении клиент сразу получает строку с паролем bandit20.

  • ./p21 --- пишет stdout nc в файл. Туда попадёт ответ сервиса (пароль bandit21).

  • & --- запустить всё это в фоне, чтобы сразу выполнить следующую команду в том же окне.

  • wait $pid --- ждём, пока nc закроет файл. Потом читаем его.

Итого: nc слушает порт 12345, на подключение отправляет строку из файла, ждёт 1 cекунду, при этом всё, что пришло от клиента, пишет в ./p21.

2) ./suconnect 12345

  • Это SUID-бинарь. Он подключается к localhost:12345, читает одну строку, сравнивает с паролем bandit20.

  • Если строка верна, он шлёт обратно пароль bandit21 и закрывает соединение.

  • Из-за SUID проверка выполняется корректно, хотя обычный пользователю файл пароля bandit21 недоступен.

3) cat ./p21

  • Печатает то, что nc принял от suconnect и сохранил. Это и есть пароль bandit21.

Вывод:

bandit20@bandit:~$ nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21 &
./suconnect 12345
wait $pid
cat ./p21
[3] 47
[1] Done nc -l -p 12345 -q 5 < /etc/bandit_pass/bandit20 > /tmp/p21
-bash: ./p21: Permission denied
Read: 0qXahG8ZjOVMN9Ghs7iOWsCfZyXOUbYO
Password matches, sending next password
[3]+ Exit 1 nc -l -p 12345 -q 1 < /etc/bandit_pass/bandit20 > ./p21
EeoULMCra2q0dSkYj561DX7s1CpBuOBt
cat: ./p21: No such file or directory
[2]+ Done ( cat /tmp/in | nc -l 127.0.0.1 12345 | tr -d 'r' | tee /tmp/p21 )