如何从 C 中的 SSL/ssl_st 结构中获取 remote/peer IP 地址?
How to get the remote/peer IP address from an SSL/ssl_st structure in C?
我之前尝试过的事情是从 SSL_get_wfd
获取套接字 fd,然后将其传递给 getpeername
。我也查看了 BIO object/functions 但没有任何运气。尝试查看 /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
Frida 具有与 Sockets 相关的不错功能。
var address = Socket.peerAddress(fd);
// Assert address not null
console.log(fd, address.ip + ':' + address.port);
查看套接字activity;
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
这有点老了,“huihoo”link 已经死了。但这在搜索时确实出现了,就像我一样。
我测试过 SSL_get_wfd() and/or SSL_get_rfd() =32=]套接字描述符。在我的例子中,return编辑了相同的套接字索引。
至少对于使用基于套接字的 BIO 而言,当然您必须已经连接、接受等,才能为 SSL 上下文创建套接字。
这将是您验证从其中一个或两个函数获得的结果的第一步。如果失败,他们将 return a -1(不是有效的描述符)。
假设您像我一样有一个套接字,那么它更像是一个套接字问题(少了一个 OpenSSL 问题)。您可以使用套接字的 getpeername() 来获取“struct sockaddr”,然后使用它来调用 getnameinfo() 这将提供您是 IP 地址的主机名或数字字符串表示形式。
我之前尝试过的事情是从 SSL_get_wfd
获取套接字 fd,然后将其传递给 getpeername
。我也查看了 BIO object/functions 但没有任何运气。尝试查看 /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
Frida 具有与 Sockets 相关的不错功能。
var address = Socket.peerAddress(fd);
// Assert address not null
console.log(fd, address.ip + ':' + address.port);
查看套接字activity;
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
这有点老了,“huihoo”link 已经死了。但这在搜索时确实出现了,就像我一样。
我测试过 SSL_get_wfd() and/or SSL_get_rfd() =32=]套接字描述符。在我的例子中,return编辑了相同的套接字索引。
至少对于使用基于套接字的 BIO 而言,当然您必须已经连接、接受等,才能为 SSL 上下文创建套接字。
这将是您验证从其中一个或两个函数获得的结果的第一步。如果失败,他们将 return a -1(不是有效的描述符)。
假设您像我一样有一个套接字,那么它更像是一个套接字问题(少了一个 OpenSSL 问题)。您可以使用套接字的 getpeername() 来获取“struct sockaddr”,然后使用它来调用 getnameinfo() 这将提供您是 IP 地址的主机名或数字字符串表示形式。