[linux] скрипт для сбора информации о домене/ip

12
J
На сайте с 28.03.2010
Offline
21
6092

"этхтоваще" - скрипт, собирающий разную информацию о домене/ip, как то: обратный резолв IP домена и его NS; домены на одном IP (о да :cool:); открытые популярные порты; заголовки веб-серверов и другое. Подробнее смотрите в исходном коде файла hto.sh

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

Скрипт имеет воз зависимостей, если не хотите всё устанавливать, то удалите в hto.sh код от

#---> проверка зависимостей

до

#---> проверка введенных данных

, но тогда скрипт может (и будет) работать некорректно.

точно работает на centos, debian и opensuse, еще говорят, что работает в убунте, но я не проверял. на windows может будет работать, если установите cygwin и весь воз зависимостей (говорят, работает). на *BSD теоретически должен работать, не проверял.

скрипт постоянно правлю, так что иногда выполняйте -u для обновления.

автор - я, лицензия - CC BY-NC-SA, засим прошу распространять бесплатно.

скачать: http://178.162.136.209/files/hto.zip

(где hto.sh - главный скрипт, hto_func - функции, hto_ports - список портов для проверки)

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

скрытого патча Бармина в скрипте нет. честно :smoke:

пример работы:

02:47 linups:~ > этхтоваще searchengines.ru

-> домен: searchengines.ru
-> собираю NSы...
> ns1.worldwidedns.net. резолв:
207.97.208.112 => ns1.worldwidedns.net.
> ns2.worldwidedns.net. резолв:
207.97.208.176 => ns2.worldwidedns.net.
> ns3.nic.ru. резолв:
194.85.61.20 => ns3.nic.ru.
> ns3.worldwidedns.net. резолв:
65.61.138.186 => ns3.worldwidedns.net.
>>> посмотреть TXT/SOA? y
-> смотрю, есть ли IP в TXT...
неа, нету
-> смотрю, что в SOA...
searchengines.ru => . gray.searchengines.ru.
searchengines.ru => ns3.nic.ru. gray.searchengines.ru.
>>> вывести http-хедэры? y
80:
HTTP/1.1 200 OK
Server: nginx/0.4.12
Date: Mon, 04 Oct 2010 22:43:04 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.2.0
------------------------------
-> получаю IP с NS...
-> смотрю на публичных NS...
-> список IP:
83.222.4.124
------------------------------
>>> вывести инфу по 83.222.4.124? y
-> инфа по IP: 83.222.4.124
-> геоип:
GeoIP Country Edition: RU, Russian Federation
GeoIP City Edition, Rev 1: RU, 48, Moscow, N/A, 55.752201, 37.615601, 0, 0
GeoIP ISP Edition: MasterHost
GeoIP Organization Edition: Masterhost is a hosting and technical support orga
GeoIP City Edition, Rev 0: RU, 48, Moscow, N/A, 55.752201, 37.615601
GeoIP ASNum Edition: AS25532 .masterhost autonomous system
------------------------------
-> обратный резолв 83.222.4.124 от публичных NS:
searchengines.ru.
-> от NS провайдера (ns.masterhost.ru.):
searchengines.ru.
-> от NS домена:
> ns1.worldwidedns.net.:
нету нифига
> ns2.worldwidedns.net.:
нету нифига
> ns3.nic.ru.:
нету нифига
> ns3.worldwidedns.net.:
нету нифига
------------------------------
>>> посмотреть открытые порты? y
-> подожди, проверяю...
80 http
------------------------------
>>> собрать домены на ip? y
-> проверяю sitedossier...
готово!
-> проверяю bing...
готово!.
>>> проверить точность? y
-> подожди, проверяю...
готово!
>>> вывести список? y
aftonletarte.blogseo.ru
aleks.com.ua
bigmak.blogseo.ru
bl123.blogseo.ru
blogseo.ru
burnis.blogseo.ru
criminalva.blogseo.ru
ctox.blogseo.ru
deku.blogseo.ru
denpanas.blogseo.ru
depesha.blogseo.ru
djeri.blogseo.ru
eyeart.blogseo.ru
gray.blogseo.ru
inessablackshire.blogseo.ru
it-thoughts.ru
jiang35p.blogseo.ru
karakovski.blogseo.ru
karnadelbrouck.blogseo.ru
marillion.blogseo.ru
medinfo.blogseo.ru
micex.blogseo.ru
nundesign.blogseo.ru
ooops.blogseo.ru
pelbeg.net
reanimator.blogseo.ru
sagitaria.blogseo.ru
searchengines.ru
seotools.blogseo.ru
shineon.blogseo.ru
shnur.blogseo.ru
splog.blogseo.ru
stas.blogseo.ru
tarry.blogseo.ru
tender.blogseo.ru
vankov.blogseo.ru
viktor.blogseo.ru
vital.blogseo.ru
volunteers.blogseo.ru
wiki.searchengines.ru
yaroslav.blogseo.ru
zipak.blogseo.ru
------------------------------
>>> сделать трассировку? n
------------------------------
>>> попробовать трансфер зоны? y
-> пробую трансфер с NS ns1.worldwidedns.net.
никак :(
-> пробую трансфер с NS ns2.worldwidedns.net.
никак :(
-> пробую трансфер с NS ns3.nic.ru.
никак :(
-> пробую трансфер с NS ns3.worldwidedns.net.
никак :(
------------------------------
>>> вывести суммарную инфу с NS? y

searchengines.ru descriptive text "v=spf1 a mx a:mail.searchengines.ru a:forum.searchengines.ru include:aspmx.googlemail.com ~all"
searchengines.ru has address 83.222.4.124
searchengines.ru has SOA record . gray.searchengines.ru. 2010092006 21600 10800 604800 3600
searchengines.ru has SOA record ns3.nic.ru. gray.searchengines.ru. 2009062932 21600 10800 604800 3600
searchengines.ru mail is handled by 10 aspmx2.googlemail.com.
searchengines.ru mail is handled by 10 ASPMX2.GOOGLEMAIL.COM.
searchengines.ru mail is handled by 10 aspmx3.googlemail.com.
searchengines.ru mail is handled by 1 aspmx.l.google.com.
searchengines.ru mail is handled by 1 ASPMX.L.GOOGLE.COM.
searchengines.ru mail is handled by 5 alt1.aspmx.l.google.com.
searchengines.ru mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
searchengines.ru mail is handled by 5 alt2.aspmx.l.google.com.
searchengines.ru mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
searchengines.ru name server ns1.worldwidedns.net.
searchengines.ru name server ns2.worldwidedns.net.
searchengines.ru name server ns3.nic.ru.
searchengines.ru name server ns3.worldwidedns.net.
-------------конец------------

//прошу не переносить тему в другой раздел - тут, имхо, самое место.

By accepting this EULA you are accepting this EULA.
bugsmoran
На сайте с 18.02.2010
Offline
223
#1

# USAGE:
#bash hto.sh домен
# или:
#bash hto.sh ip.add.re.ss
# если сделать алиас (см.выше), то можно писать:
#этхтоваще домен
# или:
#этхтоваще ip.add.re.ss
# вместо "домен" написать нужный домен, и вместо "ip.add.re.ss" - нужный IP-адрес

Изучайте функцию getopts. Комментарии в коде не для пользователя существуют, а для программиста, который правит. Остальное через флаги выводится (или отсутствие флагов). Пользователю тяжело читать что-то в консоли. Как правило он не умеет.

if [ "$flag" = "1" ];
then echo "exit"; exit;
fi
#---> проверка введенных данных
if [ "$1" = "" ];
then echo "введи домен или ip! //опции: -v, -u, -h, -p, -y";
exit;
fi

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

К тому же очень много копипаст по коду. Чтобы не было копипаст,нужно один раз написать функцию, а потом ее дергать.

#--- СБОР IP
echo "" > /tmp/ip1.txt && chmod 666 /tmp/ip1.txt
echo "-> получаю IP с NS...";
for i in `cat /tmp/ns.txt`;
do
#---> $1 - домен, $i - NS из того временного файла
ip=`host -t A $1 $i | grep -v "has\ no" | awk '{print $4}' | sed '/^ *$/d'`;
if [ "$ip" = "" ];
then echo "с $i нет нифига";
#---> пишем IP-ы во временный файл, сортируем его, ниже выводим список IP-ов
else echo $ip | sed 's/\ /\n/g' >> /tmp/ip1.txt
fi
done

Изучайте массивы. Не хранят такое в файлах.

if [ "$i" = "67.215.66.132" ]; then

Хардкод. Такие вещи выносятся в начало скрипта в отдельную переменную.

echo "A нет нифига, походу домен невалидный";
...
rez=`nc -vw 1 -z $1 $port 2>&1 | egrep -vi '(timed.out|refused|in.progress)'`; #ёбаный дебиан!

Вот такое неуважение к собственному коду (псевдокураж над собственным кодом) бывает исключительно в мире похапэшников. Вы не на PHP пишете, потому нет смысла выключать официоз.

=========

P.S.: пример как использовать функции и массивы. Примеры. что были под рукой, не адаптированные под Вашу задачу. но показательные.

Кусочек apache2ctl, который проверяет ИСП на предмет уродования конфига, прежде чем рестартануть его). Весь код пишется один раз:

restore_config() {
cp $APACHE2CONF'.backup' $APACHE2CONF
exit 0;
}

extended_apache_configtest() {

APACHE2CONF="/etc/apache2/apache2.conf"

if ! $HTTPD ${APACHE_ARGUMENTS} -t > /dev/null 2>&1; then
$HTTPD ${APACHE_ARGUMENTS} -t || true
restore_config
fi

if grep "^Listen" $APACHE2CONF /dev/null 2>&1; then
restore_config
fi

cp $APACHE2CONF $APACHE2CONF'.backup'

}

case $ARGV in
start)
mkdir -p ${APACHE_RUN_DIR:-/var/run/apache2}
install -d -o ${APACHE_RUN_USER:-www-data} ${APACHE_LOCK_DIR:-/var/lock/apache2}
# ssl_scache shouldn't be here if we're just starting up.
# (this is bad if there are several apache2 instances running)
rm -f ${APACHE_RUN_DIR:-/var/run/apache2}/*ssl_scache*
$HTTPD ${APACHE_ARGUMENTS} -k $ARGV
extended_apache_configtest
ERROR=$?
;;
stop|graceful-stop)
$HTTPD ${APACHE_ARGUMENTS} -k $ARGV
ERROR=$?
;;
restart|graceful)
extended_apache_configtest
if $HTTPD ${APACHE_ARGUMENTS} -t 2> /dev/null ; then
$HTTPD ${APACHE_ARGUMENTS} -k $ARGV
else
$HTTPD ${APACHE_ARGUMENTS} -t
fi
ERROR=$?
;;

Пример как использовать массивы:

       declare -a database_list
for DATABASE in `mysql -uroot -p$PASSWORD mysql -N --execute=\"show databases;\"`
do
database_list[db++]=$DATABASE;
done

ну и собрав массив вот так использовать:

for database_item in ${database_list[@]}; \
do mysqldump ... $database_item ... > ...
done

Пример использования getopts:

E_BADARGS=65

PrintHelpAndExit() {
echo
echo "Порядок использования:";echo
echo "$0 [-a] -s hostN -b backupN";echo
echo "Где hostN - имя хост-машины (Dom0), а backupN - имя бэкап-сервера"
echo "или вместо hostN, serverN/IP-address, в случае бэкапа одного пользователя"; echo
echo "Флаги:"
echo "-s -- Имя целевого сервера"
echo "-b -- Имя бэкап-сервера"
echo "-t -- Тестовый запуск при подключении нового сервера"
echo "-u -- User_ID удаляемого пользователя"
echo "-a -- Бэкап всех серверов включая служебные"
echo " (проигнорируется при использовании флага "-u")";
echo " (по умолчанию бэкапится только сервер,"
echo " на котором находятся пользовательские данные)";
echo "-h -- Просмотр этой справки"; echo
exit $E_BADARGS;
}


# Exemining options from command line
while getopts "s:b:u:aht" optionName; do
case "$optionName" in
a) ALL_SERVERS=YES;;
s) HOST=$OPTARG;;
b) BACKUP_SERVER=$OPTARG;;
u) USER_TO_DELETE=$OPTARG;;
t) DRY_RUN=YES;;
h) PrintHelpAndExit 0;;
\?) PrintHelpAndExit 0;;
*) PrintHelpAndExit $E_BADARGS;;
esac
done
J
На сайте с 28.03.2010
Offline
21
#2

> Изучайте функцию getopts

спасибо, покурю!

> нужно один раз написать функцию, а потом ее дергать.

старался по-максимуму, см hto_func

> Изучайте массивы. Не хранят такое в файлах.

чем плохо использование файла?

> Такие вещи выносятся в начало скрипта в отдельную переменную.

ок, вынесу.

=======

спасибо за примеры, перепишу скрипт :)

jahost добавил 05.10.2010 в 04:55

bugsmoran, как в целом впечатление - хорошее дело делаю, или глупость затеял?

bugsmoran
На сайте с 18.02.2010
Offline
223
#3
jahost:

> Изучайте массивы. Не хранят такое в файлах.

чем плохо использование файла?

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

Короче привыкайте делать изначально качественно, даже если качество не требуется. Привычка - самое главное.

jahost:

спасибо за примеры, перепишу скрипт :)

Незачто. Я там дополнил немного.

jahost:
как в целом впечатление - хорошее дело делаю, или глупость затеял?

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

J
На сайте с 28.03.2010
Offline
21
#4

наверное, стоит каждую функцию вынести как опцию.

> Вообще я бы быстрее руками посмотрел, что мне надо.

грабить sitedossier и bing руками неудобно :)

> Данные полчаете сомнительной ценности.

зато повышение навыка написания скриптов

bugsmoran
На сайте с 18.02.2010
Offline
223
#5
jahost:
наверное, стоит каждую функцию вынести как опцию.

> Вообще я бы быстрее руками посмотрел, что мне надо.

грабить sitedossier и bing руками неудобно :)

А их и не надо грабить. Утилиты whois, telnet и dig способны вытащить помоему всю возможную информацию. И вообще одного telnet на все достаточно.

ENELIS
На сайте с 29.08.2008
Offline
194
#6

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

С Уважением, ServerAstra.ru (https://serverastra.com) - VPS и выделенные сервера в Будапеште по выгодным ценам!
J
На сайте с 28.03.2010
Offline
21
#7

bugsmoran, приведите, пожалуйста, пример, как телнетом узнать список (почти)всех доменов на одном IP-адресе

ENELIS, в планах убрать вопросы и сразу выводить всю найденную информацию

bugsmoran
На сайте с 18.02.2010
Offline
223
#8
jahost:
bugsmoran, приведите, пожалуйста, пример, как телнетом узнать список (почти)всех доменов на одном IP-адресе

А, это да, это не узнать телнетом. Но это совершенно ненужное знание ведь. А то что нужно можно узнать телнетом.

J
На сайте с 28.03.2010
Offline
21
#9
bugsmoran:
А, это да, это не узнать телнетом. Но это совершенно ненужное знание ведь. А то что нужно можно узнать телнетом.

но это довольно муторно, проще какой-нибудь host -t ANY $domain_name $ns_name :)

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

Romka_Kharkov
На сайте с 08.04.2009
Offline
485
#10
jahost:
bugsmoran, приведите, пожалуйста, пример, как телнетом узнать список (почти)всех доменов на одном IP-адресе

Если вас интересует процесс, то я легко вам его изложу, берете, генерируете все возможное кол-во доменов в одну базу, а следом начинаете в цикле подключаться на 80й порт сервера телнетом и путем GET пробуете получить правильный ответ... В принципе не сложно, но надо будет очень долго ждать, такой информации нельзя получить в принципе с точки зрения внешних соединений, я не говорю о моменте когда сломали сервер и получили вообще везде доступ....

Так или иначе любая информация которую вы видите в виде "сколько сайтов на IP" складывается на уровне анализа появления доменов в тех или иных базах (при регистрации, при всевозможном SEO, поисковые боты..), и в процессе штатных запросов тех же поисковых ботов, они просто запоминают на ком IP был сайт.... а дальше это спокойно можно анализировать..... и показывать в виде "сколько на конкретном IP сайтов есть в системе".

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

Есть около 15.000 ipv4 !!! (http://onyx.net.ua/price.php#ipv4) Качественный хостинг с 2005 года - лучшее клиентам! (http://onyx.net.ua/)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий