【问题标题】:How to get the remote/peer IP address from an SSL/ssl_st structure in C?如何从 C 中的 SSL/ssl_st 结构中获取远程/对等 IP 地址?
【发布时间】:2020-09-16 04:12:22
【问题描述】:

我之前尝试过的方法是从SSL_get_wfd 获取套接字fd,然后将其传递给getpeername。我还查看了 BIO 对象/函数,但没有任何运气。尝试查看 /usr/include/openssl 中的 openSSL 实现,但再次失败。

有人知道如何获取 openSSL 套接字连接的远程 IP 地址(和端口)吗?

一些上下文:

socket fd: 64 // the file descriptor doesn't look incorrect (to me)
after getaddress, socklen: 28 // the length of the plausible address also looks correct
sockaddr ptr: 0x7b0b0fcac0, val: 0x0 // the pointer is empty despite being allocated :(

编辑:我的工作所依据的文档: https://docs.huihoo.com/doxygen/openssl/1.0.1c/structssl__st.html

【问题讨论】:

  • 你所描述的应该对我有用。您是否在 getpeername 的输入中正确设置了 addrlen 参数? (请注意,对于所有 C 库,包括 /usr/include 中的标头在内的标头仅包含声明而不包含实现。)
  • 我确实正确分配了 addrlen 并且它在 getpeername 之后设置为正确的长度,这让我相信它被正确调用。我没有提到的一个事实是我将这个函数与 Frida 挂钩(将 js 变量传递给 NativeFunctions)。无论如何,我能够使用 SSL_get_servername 获取主机名。
  • 如果 addrlen 在 getpeername() 之前(错误地)设置为零,addrlen 将设置为地址的长度('正确'),但地址不会存储在 addr 中;请参阅手册页(或 POSIX)。 SSL_get_servername on client 是 SNI 中 specified 作为 desired 服务器的名称,它并不总是您实际连接到的主机,并且 可以完全省略(尽管在公共网络现在许多服务器拒绝没有 SNI 的握手)。

标签: c openssl ip-address frida


【解决方案1】:

Frid​​a 有与Sockets 相关的不错的功能。

        var address = Socket.peerAddress(fd);
        // Assert address not null
        console.log(fd, address.ip + ':' + address.port);

查看套接字活动;

Process
  .getModuleByName({ linux: 'libc.so', darwin: 'libSystem.B.dylib', windows: 'ws2_32.dll' }[Process.platform])
  .enumerateExports().filter(ex => ex.type === 'function' && ['connect', 'recv', 'send', 'read', 'write'].some(prefix => ex.name.indexOf(prefix) === 0))
  .forEach(ex => {
    Interceptor.attach(ex.address, {
      onEnter: function (args) {
        var fd = args[0].toInt32();
        if (Socket.type(fd) !== 'tcp')
          return;
        var address = Socket.peerAddress(fd);
        if (address === null)
          return;
        console.log(fd, ex.name, address.ip + ':' + address.port);
      }
    })
  })

输出示例

$ frida -Uf com.example.app -l script.js --no-pause
[Android Model-X::com.example.app]-> 
117 write 5.0.2.1:5242
117 read 5.0.2.1:5242
135 write 5.0.2.1:4244
135 read 5.0.2.1:4244
135 read 5.0.2.1:4244

【讨论】:

    【解决方案2】:

    这有点老了,“huihoo”链接已经死了。但这确实会在搜索时出现,就像它为我所做的那样。

    我测试过,确实 SSL_get_wfd() 和/或 SSL_get_rfd() 确实返回了套接字描述符。在我的情况下,要么返回相同的套接字索引。

    至少对于使用基于套接字的 BIO,当然您必须已经连接、接受等,才能为 SSL 上下文创建一个套接字。

    这将是您验证您从这些功能中的一个或两个获得什么的第一步。如果失败,它们将返回 -1(不是有效的描述符)。

    假设您像我一样有一个套接字,那么它就变成了一个套接字问题(而不是 OpenSSL 问题)。您可以使用套接字的 getpeername() 来获取“struct sockaddr”,然后使用它来调用 getnameinfo(),这将为您提供主机名或数字字符串IP 地址的表示。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2013-01-16
      相关资源
      最近更新 更多