Время было вечером, делать было нечего… Было решено удивить читателей. Но как? Банальные поиски уязвимостей на известных сайтах уже никому не интересны. Чтож, значит включим фантазию… Ведь у пользователей тоже есть сайты! Срочно проверить их на стойкость!
Как все происходило:
Нужно было придумать план действия. Впринципе, все заключалось в том, чтобы спарсить как можно больше страниц пользователей и затем спарсить в них страницы сайтов. Затем поставить все это на сканер. Как-то так…
Как это работает?
Пункт первый: Спарсить страницы.
Не все так просто, чтоб вы знали… На странице /users лежит не так много, как хочется, пользователей. Решено было рекурсивно идти по юзерам и брать там из подписчиков других юзеров, а там еще юзеров и еще…
Расчехлен любимый питон, включено воображение, написано вот это:
import urllib2, re
start = "первый пользователь"
""" Выкачиваем страничку первого пользователя, и парсим с нее имена первых жертв """
page = urllib2.urlopen("http://habrahabr.ru/users/"+start+"/subscription/followers/").read()
names = re.findall('<div class="username"><a href="/users/(.*?)/">(.*?)</a></div>', page)
""" рекурсивная функция, которая, вызывая себя в себе, будет ходить по сайту в поисках новых жертв"""
def going(names):
for name in names:
page = urllib2.urlopen("http://habrahabr.ru/users/"+name[0]+"/subscription/followers/").read()
names = re.findall('<div class="username"><a href="/users/(.*?)/">(.*?)</a></div>', page)
""" и писать новых жертв в файл """
base = open('habrs.txt', 'a')
writed = 0
for item in names:
base.write(item[0]+"rn")
writed = writed + 1
print 'Saved habrs's: '+str(writed)
going(names)
going(names)
После некоторого времени работы было спарсено достаточное количество хабралюдей(около 10к). Ясно понятно, что большая часть этих людей повторяются… Что же делать?
Пункт второй: Уникализировать
Подумав, я решил, что грузить питон будет несправедливо. Поэтому в мой
Весь скрипт заключается в открывании-закрывании файла, но зато сама уникализация в одну функцию.
<?php
$arr = file_get_contents("habrs.txt");
$arr = explode("rn", $arr);
$arr = array_unique($arr);
$string = "";
foreach($arr as $name){
$string = $string.$name."rn";
}
file_put_contents("habrs2.txt", $string);
?>
Запускалось все из консоли, все отлично работает.
Получилось чуть меньше 2к уникальных хабролюдей… Значит теперь нужно пойти и найти их сайты.
Пункт третий: Поиск сайтов
Опять достал питон, и написал такое. Все очень просто, идем по файлу(построчно), переходим на странички пользователей, ищем сайты. Находим, прячем в файл.
import urllib2, re
sites = ""
users = file("habrs2.txt")
for user in users:
user = re.split("rn", user)[0]
page = urllib2.urlopen("http://habrahabr.ru/users/"+user+"/").read()
site = re.findall('<a href="(.*?)" class="url icon" target="_blank">(.*?)</a>',page)
if len(site) > 0:
for site, fake in site:
sites += site+"rn"
with open("sites.txt", "a") as f:
f.write(sites)
Сайтов получилось приличное количество, и если они не повторялись, то имели неудобоваримый вид.
Нужно их почистить…
Пункт четвертый: Чистим сайты
Используем preg_match в php.
<?php
$arr = file_get_contents("sites.txt");
$arr = explode("rn", $arr);
$string = "";
foreach($arr as $name){
if (preg_match('/http://([^/]+)//i', $name, $matches)) {
$name = $matches[1];
} elseif (preg_match('/^http://([^/]+)$/i', $name, $matches)) {
$name = $matches[1];
}
$string = $string.$name."rn";
}
file_put_contents("sites2.txt", $string);
?>
Получаем хороший список, аля:
yandex.ru
google.com
yahoo.com
Теперь нужно все это прикрутить к сканеру, получить ответ, спрятать в файл…
Пункт пятый: полет со сканером
На питоне была написана микропрограмма, для манипуляций с консолью.
Пишу по памяти, потому как этот скрипт был написан на продакшне(BackTrack r3 на виртуалке), и после счастливого нахождения огромной кучи уязвимостей все это дело было закрыто, без сохранения(виртуалка в смысле), поэтому сам скрипт не сохранился…
Смысл в том, чтобы запустить перл скрипт nikto.pl на 60 сек, и то, что он успеет за это время, записать в файл с именем сайта(для простоты дальнейшей обработки).
import os, time
sites = file("sites2.txt")
for site in sites:
os.system("perl nikto.pl -h "+site+" | tee "+site+".txt")
os.system("pidof perl | tee perlID.txt")
time.sleep(60)
pid = file("perlID.txt")[0]
os.system("taskkill "+pid)
После работы сего сканера в файлах вида: сайт.txt, обнаруживались быстро найденные уязвимости(в течение 60 секунд).
Пункт шестой: разбор полетов
После некоторого времени работы(оставлял на ночь) я решил посмотреть, что же там за дыры…
Потому как читатели достаточно прошаренно в этом деле(в информационной безопасности в смысле) некоторые отчеты оказались вовсе без радующих глаз плюсиков…
Однако, среди 3-х сотен сайтов были обнаружены и «дырявые» сайты.
Рейтинг уязвимостей
1). Всевозможные открытые папки и не разрешенные к доступу файлы. (40~ сайтов)
2). Различные возможные места SQL и XSS. (20~ сайтов)
3). Опасные протоколы обмена информацией, незапароленные memcached и всяческие дыры в админках(нет проверки на доступ к файлам, или пустой пароль = полный пароль). (10~ сайтов)
4). Откровенные ошибки(или недоработки). Отсутствие пароля на админку(скрипт ругался аж на 12 файлов, и посылал посмотреть, что же там интересного). (2 сайта)
5). Встреченная в единственном экземпляре ошибка, и то по недосмотру(я думаю), прямой доступ к phpmyadmin'у с логином root и без пароля(дефолтные настройки). Больше на этом сайте НИКАКИХ уязвимостей найдено не было, поэтому считаю, что это просто по недосмотру.
Проверены были не все пользователи, не все сайты, не все возможности из всех возможностей!
Я надеюсь, что этот пост будет полезен кому-то(какой-то администратор вдруг проверит на своем сайте что-то).
Администраторы уязвимых сайтов извещены. Надеюсь на положительные мысли в ваших головах!
Автор: san9s