Path: blob/dev/cmd/integration-test/javascript.go
2070 views
package main12import (3"log"4"time"56"github.com/ory/dockertest/v3"7"github.com/projectdiscovery/nuclei/v3/pkg/testutils"8osutils "github.com/projectdiscovery/utils/os"9"go.uber.org/multierr"10)1112var jsTestcases = []TestCaseInfo{13{Path: "protocols/javascript/redis-pass-brute.yaml", TestCase: &javascriptRedisPassBrute{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},14{Path: "protocols/javascript/ssh-server-fingerprint.yaml", TestCase: &javascriptSSHServerFingerprint{}, DisableOn: func() bool { return osutils.IsWindows() || osutils.IsOSX() }},15{Path: "protocols/javascript/net-multi-step.yaml", TestCase: &networkMultiStep{}},16{Path: "protocols/javascript/net-https.yaml", TestCase: &javascriptNetHttps{}},17}1819var (20redisResource *dockertest.Resource21sshResource *dockertest.Resource22pool *dockertest.Pool23defaultRetry = 324)2526type javascriptNetHttps struct{}2728func (j *javascriptNetHttps) Execute(filePath string) error {29results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "scanme.sh", debug)30if err != nil {31return err32}33return expectResultsCount(results, 1)34}3536type javascriptRedisPassBrute struct{}3738func (j *javascriptRedisPassBrute) Execute(filePath string) error {39if redisResource == nil || pool == nil {40// skip test as redis is not running41return nil42}43tempPort := redisResource.GetPort("6379/tcp")44finalURL := "localhost:" + tempPort45defer purge(redisResource)46errs := []error{}47for i := 0; i < defaultRetry; i++ {48results := []string{}49var err error50_ = pool.Retry(func() error {51//let ssh server start52time.Sleep(3 * time.Second)53results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)54return nil55})56if err != nil {57return err58}59if err := expectResultsCount(results, 1); err == nil {60return nil61} else {62errs = append(errs, err)63}64}65return multierr.Combine(errs...)66}6768type javascriptSSHServerFingerprint struct{}6970func (j *javascriptSSHServerFingerprint) Execute(filePath string) error {71if sshResource == nil || pool == nil {72// skip test as redis is not running73return nil74}75tempPort := sshResource.GetPort("2222/tcp")76finalURL := "localhost:" + tempPort77defer purge(sshResource)78errs := []error{}79for i := 0; i < defaultRetry; i++ {80results := []string{}81var err error82_ = pool.Retry(func() error {83//let ssh server start84time.Sleep(3 * time.Second)85results, err = testutils.RunNucleiTemplateAndGetResults(filePath, finalURL, debug)86return nil87})88if err != nil {89return err90}91if err := expectResultsCount(results, 1); err == nil {92return nil93} else {94errs = append(errs, err)95}96}97return multierr.Combine(errs...)98}99100// purge any given resource if it is not nil101func purge(resource *dockertest.Resource) {102if resource != nil && pool != nil {103containerName := resource.Container.Name104_ = pool.Client.StopContainer(resource.Container.ID, 0)105err := pool.Purge(resource)106if err != nil {107log.Printf("Could not purge resource: %s", err)108}109_ = pool.RemoveContainerByName(containerName)110}111}112113func init() {114// uses a sensible default on windows (tcp/http) and linux/osx (socket)115pool, err := dockertest.NewPool("")116if err != nil {117log.Printf("something went wrong with dockertest: %s", err)118return119}120121// uses pool to try to connect to Docker122err = pool.Client.Ping()123if err != nil {124log.Printf("Could not connect to Docker: %s", err)125}126127// setup a temporary redis instance128redisResource, err = pool.RunWithOptions(&dockertest.RunOptions{129Repository: "redis",130Tag: "latest",131Cmd: []string{"redis-server", "--requirepass", "iamadmin"},132Platform: "linux/amd64",133})134if err != nil {135log.Printf("Could not start resource: %s", err)136return137}138// by default expire after 30 sec139if err := redisResource.Expire(30); err != nil {140log.Printf("Could not expire resource: %s", err)141}142143// setup a temporary ssh server144sshResource, err = pool.RunWithOptions(&dockertest.RunOptions{145Repository: "lscr.io/linuxserver/openssh-server",146Tag: "latest",147Env: []string{148"PUID=1000",149"PGID=1000",150"TZ=Etc/UTC",151"PASSWORD_ACCESS=true",152"USER_NAME=admin",153"USER_PASSWORD=admin",154},155Platform: "linux/amd64",156})157if err != nil {158log.Printf("Could not start resource: %s", err)159return160}161// by default expire after 30 sec162if err := sshResource.Expire(30); err != nil {163log.Printf("Could not expire resource: %s", err)164}165}166167168